James
James

Reputation: 15

Matlab: Summation over Array Dimensions

I've done quite a bit of searching and haven't been able to find a satisfactory answer so far, so I'm sorry if this question has already been raised.

I'm stuck on how to sum over the dimensions of an array. I have array A(w0,lambda,2048,2048), and I would like to be able to define a second array U(w0, 2048, 2048) which is composed of the sum of A over dimension lambda.

So far I have been defining both A and U as follows:

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

Where ASM is just a function. z1 and z2 are defined earlier, and not relevant here.

I have been trying to come up with other possible ways of finding U(w0,2048,2048) as the sum over the second dimension of A (lambda), but haven't been successful...

Thanks for any pointers, and sorry again if this has already been resolved!

James.

Upvotes: 0

Views: 1943

Answers (2)

Arcturus
Arcturus

Reputation: 548

Try using 'sum' function with a dimension argument, and collapse result on the desired dimensions.

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.

Upvotes: 0

Oliver Charlesworth
Oliver Charlesworth

Reputation: 272752

From the sounds of it, you just want:

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

squeeze() eliminates singleton dimensions.

Here are two alternative solutions:

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

or:

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

Upvotes: 1

Related Questions