Manipulating Matrix elements based on their index without using a for loop.
7 vues (au cours des 30 derniers jours)
Afficher commentaires plus anciens
Noah Chrein
le 18 Juin 2015
Modifié(e) : Tim
le 18 Juin 2015
Can I do simple manipulations on each matrix element based on its index without having to run a for loop?
for example, say I want to take the inscribed circular region of diameter n in an n by n matrix A, and set everything else to zero, I would then do
for i = 1:n
for j = 1:n
if ((i-n/2)^2+(j-n/2)^2>n) A(i,j) = 0; end;
end
end
for large n, this becomes a very high memory problem.
the same thing with a square can be done easily, say the matrix A is some arbitrary size and I want the first m by n matrix, I could just do this
A(1:m,1:n)
I am thinking there is some syntax like
A([logical operation based on index])
I know for just value, this can be done with a logical operator directly on the matrix
A<1
returns all the positions of elements less than 1
0 commentaires
Réponse acceptée
Azzi Abdelmalek
le 18 Juin 2015
[jj,ii]=meshgrid(1:n,1:n);
A((ii-n/2).^2+(jj-n/2).^2>n)=0
1 commentaire
Tim
le 18 Juin 2015
This doesn't quite work, I think you meant something like this:
n=100
[jj,ii]=meshgrid(1:n,1:n);
A = (sqrt((ii-n/2).^2 + (jj-n/2).^2)< n/2)*100
image(A)
Plus de réponses (1)
Tim
le 18 Juin 2015
Modifié(e) : Tim
le 18 Juin 2015
Try this.
clear all;
%We want to inscribe a circle of diameter n on an nxn matrix A.
%More generally we want an index based method for assinging
%values to a matrix without having to run a calculation on each element.
%Presumably we want the circle center in the middle. My plan of attack is
%to generate a list of index pairs first and then assign it to the matrix.
%Matrix row/column and coincidentally circle diameter
n=95;
%For efficiency, instantiate the matrix A
A = zeros(n+1);
%Use a paramterized function to generate the i and j indices to appropriate
%resolution(This will change based on how big n is; higher n, more
%resolution required in this step.)
%We must use linear indexing to assign scattered values so calculate a new
%indices vector which gives a numeric value for the element number of each
%index pair i.e. A(1,1) = 1 and A(n,n) would be like 10,000 for n=100.
%luckily we have the sub2ind function which does this for us.
t=0:.01:2*pi;
idx = sub2ind(size(A), int16((n/2).*sin(t))+n/2, int16((n/2).*cos(t))+n/2);
%assign values to your generated indices in A
A(idx)=100;
%Check your work
image(A);
This method should work for any shape you could parameterize or define in a vector form. See my comment on Azzi's answer for the way to generate a filled in shape.
0 commentaires
Voir également
Catégories
En savoir plus sur Loops and Conditional Statements dans Help Center et File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!