2015-11-16 30 views
2

我正在使用matlab根據模式進行3維數組。儘管我可以手動寫出數組,但我確信有更快的方法來完成它。按照模式創建多維數組

multiArray = cat(3,... 
       [1+randn(4,3); 1*randn(4,3)],... 
       [2+randn(4,3); 2*randn(4,3)],... 
       [3+randn(4,3); 3*randn(4,3)]); 

如果我想作出上述陣列是8x3x25然後最後一行將

[25+randn(4,3); 25*randn(4,3)] 

但我怎麼能做出這樣的陣列,而不所有繁瑣的中間步驟去?

+1

因素可能應該是1 2 3而不是1 3 3? – Daniel

回答

3

雖然mikkola basically got the solution,最後不需要改變尺寸。

s=[4,3,25]; 
it=reshape(1:s(3),1,1,[]); 
out = [bsxfun(@plus , it, randn(s));... 
     bsxfun(@times, it, randn(s))]; 
+1

一個很好的解決方案。尤其喜歡參數化與我的版本相比的維度。 – mikkola

3

以下是使用bsxfun的一種可能方法。

%// 25 x 4 x 3 with elements for i + randn(4,3) 
P = bsxfun(@plus, (1:25)', randn(25,4,3)); 
%// 25 x 4 x 3 with elements for i * randn(4,3) 
T = bsxfun(@times, (1:25)', randn(25,4,3)); 
%// Concatenate and shift dimensions to get desired size output 
multiArray = shiftdim([P T], 1); 
1

如果你不介意的事情4D爲了效率的目的 -

N = 25; %// Number of 3D slices 
out = randn(4,2,3,N); 
out(:,1,:,:) = bsxfun(@plus,permute(1:N,[1 4 3 2]),out(:,1,:,:)); 
out(:,2,:,:) = bsxfun(@times,permute(1:N,[1 4 3 2]),out(:,2,:,:)); 
out = reshape(out,8,3,N); 

合法化的解決方案,讓我們開始與A = randn(8,3,N)輸入並初始化輸出out與它。另外,讓我們把3D切片的數量作爲一個小數字,比如說N = 3

因此,

>> N = 3; 
A = randn(8,3,N); 
out = reshape(A,[4 2 3 N]); %// This replaces "out = randn(4,2,3,N)" 

接下來,我們運行,這將改變out代碼 -

>> out(:,1,:,:) = bsxfun(@plus,permute(1:N,[1 4 3 2]),out(:,1,:,:)); 
out(:,2,:,:) = bsxfun(@times,permute(1:N,[1 4 3 2]),out(:,2,:,:)); 
out = reshape(out,8,3,N); 

現在開始每3D片驗證 -

>> out(1:4,:,1) - A(1:4,:,1) 
ans = 
      1   1   1 
      1   1   1 
      1   1   1 
      1   1   1 
>> out(1:4,:,2) - A(1:4,:,2) 
ans = 
    2  2  2 
    2  2  2 
    2  2  2 
    2  2  2 
>> out(1:4,:,3) - A(1:4,:,3) 
ans = 
    3  3  3 
    3  3  3 
    3  3  3 
    3  3  3 
>> out(5:end,:,1)./A(5:end,:,1) 
ans = 
    1  1  1 
    1  1  1 
    1  1  1 
    1  1  1 
>> out(5:end,:,2)./A(5:end,:,2) 
ans = 
    2  2  2 
    2  2  2 
    2  2  2 
    2  2  2 
>> out(5:end,:,3)./A(5:end,:,3) 
ans = 
      3   3   3 
      3   3   3 
      3   3   3 
      3   3   3