matrix with general rule
4 views (last 30 days)
Show older comments
Dear all, I have the code below:
m=6;
M=21;
Z_matrix=zeros(M+2,M+2);
A=1;
B=2;
for i=1:1:m
for j=1:1:i
k=(i-1)*i/2+j;
Z_matrix(k+1,func(i-1,j-1))=B;
Z_matrix(k+1,func(i-1,j))=A;
Z_matrix(k+1,func(i-1,j+1))=B;
Z_matrix(k+1,func(i,j-1))=A;
Z_matrix(k+1,func(i,j))=B;
Z_matrix(k+1,func(i,j+1))=A;
Z_matrix(k+1,func(i+1,j-1))=B;
Z_matrix(k+1,func(i+1,j))=A;
Z_matrix(k+1,func(i+1,j+1))=B;
end
end
where
function z=func(x,y)
z=(x-1)*x/2+y;
end
However, my problem is the function z=func(x,y) can give the index which might be larger than M+2 or less than 1. I mean if the index is larger or smaller than the actual, we just simply cancel this term. This is something like the boundary effect, I guess
Do you have any suggestion for this problem? Thanks
0 Comments
Answers (2)
John D'Errico
on 3 May 2016
Suggestion for what? It is impossible to create the zeroth column of a matrix in MATLAB. Indices cannot be negative. If the index is larger than the matrix, then MATLAB dynamically will resize the matrix, adding columns filled with zeros.
So your question has no meaning in terms of MATLAB syntax. You need to decide what to do when that index is less than zero.
POSSIBLY...
I note that you use effectively the same rule for the rows. There you compute k using the same rule, but then you add 1. Possibly, you wanted to do exactly that. But how can I know? It is your matrix, your rules.
2 Comments
John D'Errico
on 3 May 2016
Edited: John D'Errico
on 3 May 2016
So have a second function that IF the argument is less than 1, it returns an empty array. Otherwise, it should return the argument.
function ind = checkneg(ind)
% returns ind only if ind >= 1. otherwise, empty
if ind < 1
ind = [];
end
So, now your code will look like
Z_matrix(k+1,checkneg(func(i-1,j-1)))=B;
If the column index is an empty array, then it effectively skips executing that line.
The row index will never have that problem, so no need to worry there.
Star Strider
on 3 May 2016
Change your for limits to:
for i=2:1:m-1
for j=2:1:i.
That way, you will not overwrite your matrices. You may need to experiment, and recalculate ‘k’ to accommodate these changes.
Another option is to keep the for index limits as they are, and to limit the indices to the minimum and maximum values for the matrix (as I usually do).
For example:
Z_matrix(k+1,func(max(1,i-1),max(1,j-1)))=B;
...
Z_matrix(k+1,func(min(M+2,i+1),min(M+2,j+1)))=B;
This simply avoids overwriting the matrix limits. You have to decide if this is appropriate to what you want to do.
2 Comments
Star Strider
on 3 May 2016
Edited: Star Strider
on 3 May 2016
That’s one option. It depends on what you want your code to do. The only problem I see with the if block is that it could create discontinuities in your result.
You have already created your matrix as being (M+2,M+2), so if you use the max and min limit approach, and then trim the first and last rows and columns, you would get your (M,M) matrix. If you want it to be (M+2,M+2), consider creating it as (M+4,M+4), and doing the same thing with the max and min limits, then remove the first and last rows and columns. That would create your full matrix, without having to make any compromises in constructing it.
I would also look through the conv2 function to see if it does what you want.
I ran your code, but since I don’t understand the result you want, it’s difficult for me to suggest a specific approach.
See Also
Categories
Find more on Matrix Indexing in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!