Flow through a binary matrix [closed] - matlab

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 6 years ago.
Improve this question
I have being supplied an mxn random generated binary matrix which allows flow through the value 1 but not through the value 0. I need to determine if there is a path of flow from the top to the bottom of the random generated matrix. The 1s have to be adjacent to one another. It is for programming in Matlab.
Any reference to helpful resources on how to code the problem, or algorithm examples will be greatly appreciated.
I have some code which initially searches for the first 1 in the top row.
The code therafter searches all the surrounding positions, below and adjacent to the current 1. The flow can only move diagonally down, directly left or directly right.
The purpose i to see if there is a way, given the above restrictions, to traverse from the top to the bottom of the matrix following only the 1's
Random=randi([0 1],6,6)
n =0;
while Random[0,n] ~= 1
n=n+1;
end
CoOrds = [0,n];
for i = 0:5
if Random[i+1, n-1] == 1
n=n-1;
elseif Random [i,n-1] == 1
i = i-1;
n = n-1;
elseif Random [i+1,n] ==1
n=n;
elseif Random [i+1,n+1] ==1
n=n+1;
elseif Random[i,n+1] == 1
i = i-1;
n=n+1;
end
end

You can use bwlabel and regionprops to check if a path exists:
lb = bwlabel(Random, 8); %// find 8-connected regions of the random mask
st = regionprops(lb, 'BounbdingBox'); %// find bounding boxes for all regions
b = vertcat(st.BounbdingBox);
A valid path is a path that its boundingbox height (4-th entry in 'BoundingBox') equals size(Random,1):
validPathRegion = find( b(:,4) == size(Random,1) );

Related

How to calculate and save correlation coefficients in matlab? [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 2 years ago.
Improve this question
I am working on pedestrian step detection (acceleration data), I want to calculate statistical features from my filtered signal. I have already calculated some and now i want to calculate correlation coefficients .
My data is of 1x37205 double. I calculated features using for loop with moving window size=2samples and 50% overlap of previous window. Below I am attaching the code I tried with to calculate corrcoef.
Now i want to check if it is the right way to calculate and also want to save the out put. I am unable to understand well that how to save all corrcoef's. Could some one guide me or provide any code help in matlab or how i can save?
%%Here M is mean and V is variance i already calculated from filtered data
for i=window:length(M)-window
C = corrcoef(M(i-window/2:i+window/2),V(i-window/2:i+window/2))
end
Looking at the corrcoef documentation you can see that the output is a 2x2 matrix.
The easiest way then to save all the coefficients would be to initialize your matrix C outside of the loop and then just assign values at each iteration.
Perhaps something like
C = zeros(2, 2, length(window:lenght(M)-window));
for i = window:length(M) - window
C(:, :, i) = corrcoef(M(i-window/2:i+window/2),V(i-window/2:i+window/2));
end
Even better, you can also see that the output of the corrcoef function is structured like this:
[1, c1;
c2, 1];
where c1 and c2 are the actual coefficients.
So you could also do:
C = zeros(length(window:lenght(M)-window), 2);
for i = window:length(M) - window
temp = corrcoef(M(i-window/2:i+window/2),V(i-window/2:i+window/2));
C(i, 1) = temp(1, 2); % "c1"
C(i, 2) = temp(2, 1); % "c2"
end
EDIT TO ANSWER TO COMMENT
To implement a sliding window with any size and with any overlap, you might want to change the indexing:
wdwSize = 2;
overlap = 0.5;
C = zeros(length(1:wdwSize*overlap:length(A)-wdwSize*overlap), 2);
for i = 1:wdwSize*overlap:length(A)-wdwSize*overlap
window = i:i+wdwSize - 1;
temp = corrcoef(M(window), V(window));
C(i, 1) = temp(1, 2); % "c1"
C(i, 2) = temp(2, 1); % "c2"
end
In your case wdwSize*overlap is an integer, but you might want to be careful for a general combination of window size and overlap.
According to the documentation, this function reurns a matrix.
If the only problem is literally "how to save this data", you can store it in a cell array.
numSamples = length(M)-window;
result = cell(1, numSamples);
for i=window:numSamples
result{i-window+1} = corrcoef(M(i-window/2:i+window/2),V(i-window/2:i+window/2))
end
Remember that you can retrieve data from the cell array just as you would do with a list, but instead of using "result(i)" you need to use "result{i}".

Solving equations and plotting the results [closed]

Closed. This question needs to be more focused. It is not currently accepting answers.
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 3 years ago.
Improve this question
(edited, i have changed the code) Well i have compound equations that i need to solve in matlab and find the result.
I have tried different techniques but have failed.
the equations are:
u(j-1)-2(u(j))+u(j+1)= -4*h^2*pi^2 * sin(2*pi*xj)
where
n=100
j=1 to n
xj=jh
h=1/n
u(0)==u(n)==0
I need to solve the equation and plot the results. so that i can compare the results with
the exact solution.
This is the code i have written so far...
function c= prob1()
n=100;
c=(0); % variable to store all results
u = linspace(1,n-1);
for k=3:90
jay=k;
h=1/k;
syms xj
eqn6 = u(jay-1) -2*u(jay)+u(jay+1)==-4*(h^2)*(pi^2)*sin(2*pi*xj);
A = solve(eqn6, xj); % solving the equation with xj as unknown
if(~(A==0))
c=vertcat(c,A); % just filtering out the results with 0 output
end
end
end
Now i GET answers in A like this " (625*asin(1/9877545463176224))/3927 ".
which i cannot plot.
Setting up the system of equations Au = b is done by translation the math into MATLAB language as follows:
n = 100;
h = 1/n;
j = 0:n; % include zero for the boundary condition
xj = j*h;
% set up right hand side
b = (-4*h^2*pi^2*sin(2*pi*xj))';
% overwrite the first and last value of b with the right hand side of the boundary conditions:
b([1 end]) = 0;
% This is the interesting part:
% set up A: 1*u(j-1) -2*u(j) + 1*u(j+1) and include the boundary conditions
main = [1; -2*ones(n-1,1); 1];
upper = [0; ones(n-1,1)];
lower = [ones(n-1,1); 0];
A = gallery('tridiag', lower, main, upper);
If you dont see why this works, I would suggest to write out the equations for at least j = 0, n/2 and n based on A and b, and to compare them with your equations.
Now, we are ready to solve the system. The system is small so I use the backslash operator (which is a direct method), but you could also pick iterative methods like bicgstab, gmres, qmr:
u = A\b;
Plot the resulting u:
plot(xj,u)

New Random entries and Shifting [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 8 years ago.
Improve this question
please any one help me to shift 1 element towards right in a loop of 32 elements and on the first entry of an array,everytime it gets new rand number either +1,-1 and shifts the remaining elements towards right.
i am doing in this way but it's not working properly
clc
clear all
near_input=zeros(1,32); %vector of 32 elements with all zeros
y=2*round(rand(1,1))-1; % random bernoulli sequence (+1,-1)
z=[y near_input(1:end-1)];
I suggest you insert all the number at once, avoiding the shifting. You can do this simply like this:
z = 1-2*round(rand(1,32))
The inputs to rand is the number of rows and columns. Therefore, rand(1,32) is the same as putting 32 rand(1,1) next to each other. And for the record, rand(1,1) == rand().
However, if you really have to do it your way, you need to do some changes. The following works (but is really bad code).
near_input = zeros(1,32);
for ii = 1:numel(near_input)
y = 2*round(rand(1,1))-1;
near_input = [y, near_input(1:end-1)]
end
% z = near_input;
You can generate the entire sequence like this:
y = sign(2*(rand(1, 32) - 0.5)); % 1x32 array of +-1's
Or, if you insist on creating them one-by-one with 'push-right' (or more accurately 'concat-left'):
y = [];
for unused = 1:32
y = [sign(rand() - 0.5), y];
end
Which has the disadvantage of changing y's size in a loop (a real performance hit if you use large arrays). A better approach would be to pre-allocate y, and assign by index:
y = zeros(1, 32);
for index = 32:-1:1
y(index) = sign(rand() - 0.5);
end
Running the index from 32 down to 1, assigns the values into y from right to left as you put it.

Implementing the matlab find function [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 8 years ago.
Improve this question
I am trying to find the coordinates of all non zero elements in a matrix, in MATLAB. I know that find makes this very easy. The problem is that I need to define the length of my matrix before I can fill it up. I believe this is impossible using find, since it will make its own vector.
So I have to find another way. If I'm looking for 1 element it will be easy as well. Let me use an example. Say I have a matrix M of 500×500, with 60 ones somewhere. I want to find the coordinates. So I can start with:
for i = 1:500
for j = 1:500
if M(i,j) == 1
row = i;
col = j;
end
end
end
But I want more then one point, and I need to define the length of a vector before filling it. So I'll make the gamble that there are less then 100 ones in the matrix:
v = zeros(1,100)
w = zeros(1,100)
And how I essentially want to fill this vector is as follows. Let's say I have already filled N elements of the vector, so the next one will be:
for i = 1:500
for j = 1:500
if M(i,j) == 1 && i ~= v(1) && i ~= v(2) && ... && i ~= v(N) && j ~= v(1) && ... && i ~= v(N)
v(N+1) = i
w(N+1) = j
end
end
end
So I need another for loop containing all this, which will run through the elements of the vectors v and w, and I need some loop that will make sure the right if statement is being used.
Does anyone have any idea of how to do this?
Kind regards,
Jesse
Here's another way, nice & wasteful:
[jj,ii] = meshgrid(1:size(M,2),1:size(M,1));
inds = M~=0;
ii = ii(inds);
jj = jj(inds);
I honestly cannot understand what's wrong with find.
But, if you insist on your own implementation using nested loop, then
v = NaN(100,1);
w = NaN(100,1); % pre-allocate
ii=1;
for row=1:size(M,1)
for col=1:size(M,2)
if M(row,col) == 1
v(ii)=row;
w(ii)=col;
ii=ii+1; %counts howmany elements were found
end
end
end
v(isnan(v))=[]; %discard redundent elements
w(isnan(w))=[];

how to perform character segmentation in Matlab [closed]

Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers.
Questions asking for code must demonstrate a minimal understanding of the problem being solved. Include attempted solutions, why they didn't work, and the expected results. See also: Stack Overflow question checklist
Closed 9 years ago.
Improve this question
I have license plate image and I want to cut the numbers one by one.
any one have simple idea how to perform it?
after searching the web I found a way by doing the operation of horizontal and vertical smearing, but I really don't know what does it mean.
any explanation would help
Thanks in advance.
regionprops might work for you. If you take this sample license plate.
You could use a little script like this to cut out objects. Sorry, I just typed it together really quickly, but it gives you an idea.
clear all;
close all;
I = imread('plate.jpg');
BW = im2bw(I, 0.9);
BW = ~BW;
stats = regionprops(BW);
for index=1:length(stats)
if stats(index).Area > 200 && stats(index).BoundingBox(3)*stats(index).BoundingBox(4) < 30000
x = ceil(stats(index).BoundingBox(1))
y= ceil(stats(index).BoundingBox(2))
widthX = floor(stats(index).BoundingBox(3)-1)
widthY = floor(stats(index).BoundingBox(4)-1)
subimage(index) = {BW(y:y+widthY,x:x+widthX,:)};
figure, imshow(subimage{index})
end
end
This will output images like
and this
You still have to decide if it really is a letter. Be careful, the script will output a lot of images (about 30 or 40)
you can try this code(it's not mine)
% This is a program for extracting objects from an image. Written for vehicle number plate segmentation and extraction
% Authors : Jeny Rajan, Chandrashekar P S
% U can use attached test image for testing
% input - give the image file name as input. eg :- car3.jpg
clc;
clear all;
k=input('Enter the file name','s'); % input image; color image
im=imread(k);
im1=rgb2gray(im);
im1=medfilt2(im1,[3 3]); %Median filtering the image to remove noise%
BW = edge(im1,'sobel'); %finding edges
[imx,imy]=size(BW);
msk=[0 0 0 0 0;
0 1 1 1 0;
0 1 1 1 0;
0 1 1 1 0;
0 0 0 0 0;];
B=conv2(double(BW),double(msk)); %Smoothing image to reduce the number of connected components
L = bwlabel(B,8);% Calculating connected components
mx=max(max(L))
% There will be mx connected components.Here U can give a value between 1 and mx for L or in a loop you can extract all connected components
% If you are using the attached car image, by giving 17,18,19,22,27,28 to L you can extract the number plate completely.
[r,c] = find(L==17);
rc = [r c];
[sx sy]=size(rc);
n1=zeros(imx,imy);
for i=1:sx
x1=rc(i,1);
y1=rc(i,2);
n1(x1,y1)=255;
end % Storing the extracted image in an array
figure,imshow(im);
figure,imshow(im1);
figure,imshow(B);
figure,imshow(n1,[]);