2015-11-09 49 views
3

假設我有四維矩陣:如何在Matlab中裁剪任意維數的矩陣?

>> A=1:(3*4*5*6); 
>> A=reshape(A,3,4,5,6); 

,現在我想削減的行和列(或已知尺寸的任何給定的塊)的給定數。

如果我想知道這是4D我會寫:

>> A1=A(1:2,1:3,:,:); 

但如何普遍寫尺寸的任何給定多少?

下面給出不同的東西:

>> A2=A(1:2,1:3,:); 

和下面給出了一個錯誤:

>> A2=A; 
>> A2(3:3,4:4)=[]; 
+3

[本問答](http://stackoverflow.com/q/22537326/2586922)的一個小修改將會起作用 –

+0

爲了確保我正確理解這個問題 - 問題是您事先不知道有多少',:'你需要在索引表達式中......?另外我假設你的意思是「任何給定數量的維度> = 2」...? –

+0

@ Dev-iL是這是它 – Dims

回答

4

有可能使用第二形式的,以產生具有的A尺寸的一般數目的代碼索引你使用和重塑功能。 這裏有一個例子:

Asize = [3,4,2,6,4]; %Initialization of A, not seen by the rest of the code 
A = rand(Asize); 

%% This part of the code can operate for any matrix A 
I = 1:2; 
J = 3:4; 
A1 = A(I,J,:); 
NewSize = size(A); 
NewSize(1) = length(I); 
NewSize(2) = length(J); 
A2 = reshape(A1,NewSize); 

A2將是你的裁剪矩陣。它適用於您選擇的任何Asize

+1

對此的修改可能會起作用... OP不知道「Asize」,因此需要使用ndims(或檢查大小(A)的長度)並相應地採取行動。 – gariepy

+0

啊謝謝你的提示。現在它應該工作,即使不知道'Asize'。 – alexmogavero

+0

幹得好,好方法 –

0

這聽起來像你只是想使用ndims。

num_dimensions = ndims(A) 

if (num_dimensions == 3) 
    A1 = A(1:2, 1:3, :); 
elseif (num_dimensions == 4) 
    A1 = A(1:2, 1:3, :, :); 
end 

如果可能的矩陣維度的範圍很小,這種if-else塊可以保持簡單。看起來你想用某種方式創建一個索引元組(例如(1:2,:,:)),這是我不知道是否有辦法做。您必須使用索引匹配正確的維數......如果索引的維數小於矩陣的維數,matlab會返回一個值,並將未索引的維數摺疊爲單個數組(類似於您所得到的數據類似於您獲得的數據)

A1 = A(:); 
+0

當然你的意思是'elseif'而不是'else if' –

+0

呵呵......好吧,當你經常在MATLAB,Python和Java之間進行操作時會發生這種情況。適當注意並糾正。 – gariepy

4

我推薦Luis Mendo爲一般情況建議的解決方案,但是當你知道你的尺寸的上限時,也有一個非常簡單的解決方案,讓我們假設你最多有6個尺寸:對所有矩陣使用6維索引:

A1=A(1:2,1:3,:,:,:,:); 

Matlab的將隱含假設單維度所有剩餘的尺寸,並返回我對於尺寸較小的矩陣也可得出相同的結果。

+0

這是個好主意! –