2015-08-28 24 views
0

我嘗試爲二維數組的前兩個維度分配值,同時保持第三維的固定。但我得到一個錯誤。在matlab中切片並賦值給3D陣列

Assignment has fewer non-singleton rhs dimensions than non-singleton subscripts 

查看下面的代碼片段(請注意,我使用here的allcomb())。

任何想法爲什麼以及如何解決?

A = zeros(2, 94, 10); 
combs = allcomb(1:2,1:94); 
A(combs(:,1), combs(:,2), 1) = 1:(2*94); 

請注意,我的意圖是寫的矢量形式:

A = zeros(2, 94, 10); 
combs = allcomb(1:2,1:94) 
vals = 1:(2*94); 
for k=1:length(vals) 
    A(combs(k,1), combs(k,2), 1) = vals(k); 
end 

回答

0

我找到了短期和優雅的實現我一直在尋找,使用稀疏()初始化:

A = zeros(2, 94, 10); 
combs = allcomb(1:2,1:94); 
vals = 1:(2*94); 

%% Here it is: 
A(:,:,1) = sparse(combs(:,1), combs(:,2), vals); 
0

rhs,右手邊的公式需要有相同維度的lhs。在這種情況下,您正嘗試將N x 1向量分配給2 x N x 1陣列。

嘗試,

A = zeros(2, 94, 10); 
combs = allcomb(1:2,1:94); 
val = (1:2*94)'; 
A(combs(:,1), combs(:, 2), 1) = [val, val]; 

祝你好運!

+0

謝謝,但它不工作。 [val,val]是Nx2,而不是NxN。但是,無論如何,我只想分配N個值,因此將其複製到NxN分配過於昂貴。 – yuval

+0

修復了一個錯字。梳子的尺寸是多少?從上下文來看,似乎94 * 94 x 2,在這種情況下,應該做些什麼。在任何情況下,如果你添加更多的上下文代碼,它會更容易幫助。 – crowdedComputeeer

0

你可以嘗試這樣的事情:

A = zeros(2, 94, 10); 
B = A; 
combs = allcomb(1:2, 1:94); 
vals = 1:(2*94); 
for k=1:length(vals) 
     A(combs(k, 1), combs(k, 2), 1) = vals(k); 
end 

% here it starts 
val = repmat(1:94, 94, 2); 
B(combs(:, 1), combs(:, 2), 1) = [val; val + 94]; 

isequal(A, B) % returns 1 

這應該給你想要的結果。