2013-10-23 44 views
-1

是否可以将两个语句放入一个语句中。像两个FOR语句耦合成一个

A = [ 0 0 0 5 
     0 2 0 0 
     1 3 0 0 
     0 0 4 0]; 
    a=size(A); 
    b=size(A); 
    ind=0; 
    c=0; 
    for ({i=1:a},{j=1:b}) 
    end 
+0

简答:不需要很长的回答:取决于手术。你的'for'循环里有什么? – chappjc

+0

不知道你在问什么。你想迭代矩阵中的每个元素吗? – Daniel

+0

我将非零元素存储在另一个矩阵中;包含索引号,值,行号和列号等元素。 – user2864566

回答

-1

不,我不认为你可以把两个for循环中的任何一个增值线。

取决于您的操作,您可能可以重塑它并使用一个循环。如果你正在做的只是打印出的所有元素一样简单的东西,

B = reshape(A,a*b,1); 
for i=1:a*b 
    c = B(i); 
    ... 
end 
1

你提的问题是非常广泛的,但有一点要考虑的是,在MATLAB中,你可以经常利用线性索引(而不是下标)而实际上并不需要reshape这个数组。例如,

>> A = [ 0 0 0 5 
     0 2 0 0 
     1 3 0 0 
     0 0 4 0]; 
>> A(3,2) 
ans = 
    3 
>> A(7) % A(3+(2-1)*size(A,1)) 
ans = 
    3 

for遍历所有的元素,您可以经常用你的优势:

for ii=1:numel(A), 
    A(ii) = A(ii) + 1; % or something more useful 
end 

是一样的:

for ii=1:size(A,2), 
    for jj=1:size(A,1), 
     A(jj,ii) = A(jj,ii) + 1; 
    end 
end 

但解决您的这个问题的具体目标,正如你在评论中所说的(“我将另外一个矩阵中的非零元素存储在其中,包括索引号,值,行号和列号等元素)”, rse矩阵表示法,它涉及到:

>> [i,j,s] = find(A); 
>> [m,n] = size(A); 
>> S = sparse(i,j,s,m,n) 
S = 
    (3,1)  1 
    (2,2)  2 
    (3,2)  3 
    (4,3)  4 
    (1,4)  5 

但是这并不真正与更广泛的问题有关。

0

实际上,您可以将多个循环合并为一个for,但是它会要求您遍历包含所有元素而不是单个元素的矢量。

这里是一个办法做到这一点:

iRange = 1:2; 
jRange = 1:3; 
[iL jL] = ndgrid(iRange,jRange); 
ijRange = [iL(:) jL(:)]'; 
for ij = ijRange 
    i = ij(1); j = ij(2); 
end 

请注意,循环在变量可能是简单的,但也许这种方法有一定的优势。