2013-10-23 82 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 

請注意,循環在變量可能是簡單的,但也許這種方法有一定的優勢。