2013-03-02 2 views
0

Я проделал довольно много поисков и до сих пор не смог найти удовлетворительного ответа, поэтому мне жаль, что этот вопрос уже поднят.Matlab: Суммирование по массиву Размеры

Я зациклился на том, как суммировать размеры массива. У меня есть массив A (w0, lambda, 2048,2048), и я хотел бы иметь возможность определять второй массив U (w0, 2048, 2048), который состоит из суммы A по размерности lambda.

До сих пор я был определяющим как А, так и U следующим образом:

A = zeros(length(w0),length(lambda),2048,2048); 
U = zeros(length(w0),2048,2048); 
for ii = 1:length(w0)     % Scan through spot sizes 
    for aa = 1:length(lambda)   % Scan through wavelengths 
      A(ii,aa,:,:) = ASM(w0(ii),lambda(aa),z1,z2); 
    end 
    U(ii,:,:) = sum(A,2); 
end 

Где ASM это просто функция. z1 и z2 определены ранее и здесь не актуальны.

Я пытался придумать с другими возможными способами нахождения U (w0,2048,2048) как сумма по второму измерению А (лямбда), но не увенчались успехом ...

Спасибо за любые указатели, и еще жаль, если это уже было разрешено!

James.

ответ

1

Из звуков этого, вы просто хотите:

U = squeeze(sum(A, 2)); 

squeeze() устраняет одноэлементные размеры.

Вот два альтернативных решения:

U = reshape(sum(A, 2), [length(w0) 2048 2048]); 

или:

U = sum(A, 2); 
U = U(:, 1, :, :); 
+0

Большое спасибо! Теперь он работает с первым вариантом. До сих пор не сталкивалась с функцией squeeze() - довольно новая для matlab. – James

0

Попробуйте использовать 'sum' функцию с аргументом размерности, и результат коллапса от желаемых размеров.

z = rand(2,3,2,2); 
q = sum(z,2); %sum all 3 matrices of size 2x2x2 to get 2x1x2x2 result 
zz = q(:,1,:,:); %zz is now 2x2x2, by collapsing the dimension 2. 
+0

Большое спасибо за то, что нашли время ответить! Всегда хорошо иметь как можно больше способов сделать это. Я пошел на первый вариант от Oli Charlesworth, хотя - чуть меньше кода. – James

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