1

Предположим, что у меня есть массив X размера n на p на q. Я хотел бы изменить его как матрицу с p строк, и в каждой строке поместите конкатенацию n строк размера q, в результате получим матрицу размера p на nq.Перенос и изменение трехмерного массива в matlab

Мне удалось сделать это с помощью петли, но требуется некоторое время, если n = 1000, p = 300, q = 300.

F0=[]; 
for k=1:size(F,1) 
    F0=[F0,squeeze(X(k,:,:))]; 
end 

Есть ли более быстрый способ?

ответ

2

Я думаю, что это то, что вы хотите:

Y = reshape(permute(X, [2 1 3]), size(X,2), []); 

Пример с n=2, p=3, q=4:

>> X 
X(:,:,1) = 
    0  6  9 
    8  3  0 
X(:,:,2) = 
    4  7  1 
    3  7  4 
X(:,:,3) = 
    4  7  2 
    6  7  6 
X(:,:,4) = 
    6  1  9 
    1  4  3 

>> Y = reshape(permute(X, [2 1 3]), size(X,2), []) 
Y = 
    0  8  4  3  4  6  6  1 
    6  3  7  7  7  7  1  4 
    9  0  1  4  2  6  9  3 
+0

Вам не нужна другая перестановка '[1 3 2]'? – Divakar

+0

@ Divakar Хм ... не уверен, как OP хотел этого, на самом деле. –

+0

Ну, это сработало для OP! :) +1 – Divakar

2

Попробуйте это -

reshape(permute(X,[2 3 1]),p,[]) 

Таким образом, для проверки кода, можно посмотреть пример прогона пробела -

n = 2; 
p = 3; 
q = 4; 

X = rand(n,p,q) 
F0=[]; 
for k=1:n 
    F0=[F0,squeeze(X(k,:,:))]; 
end 
F0 

F0_noloop = reshape(permute(X,[2 3 1]),p,[]) 

Выход -

F0 = 
    0.4134 0.6938 0.3782 0.4775 0.2177 0.0098 0.7043 0.6237 
    0.1257 0.8432 0.7295 0.2364 0.3089 0.9223 0.2243 0.1771 
    0.7261 0.7710 0.2691 0.8296 0.7829 0.0427 0.6730 0.7669 
F0_noloop = 
    0.4134 0.6938 0.3782 0.4775 0.2177 0.0098 0.7043 0.6237 
    0.1257 0.8432 0.7295 0.2364 0.3089 0.9223 0.2243 0.1771 
    0.7261 0.7710 0.2691 0.8296 0.7829 0.0427 0.6730 0.7669 
0

Вместо того чтобы использовать векторизации, чтобы решить эту проблему, вы можете взглянуть на код, чтобы попытаться выяснить, что может повысить производительность. В этом случае, так как вы знаете размер вашей выходной матрицы F0 должно быть точек (п * д), можно предварительно выделить память для F0 и избежать постоянного изменения размера матрицы на каждой итерации цикла for

n=1000; 
p=300; 
q=300; 

F0=zeros(p,n*q); 

for k=1:size(F,1) 
    F0(:,(k-1)*q+1:k*q) = squeeze(F(k,:,:)); 
end 

Хотя, вероятно, это не так эффективно, как два других решения, это альтернатива. Попробуйте выше и посмотрите, что произойдет!

Смежные вопросы