Filter löschen
Filter löschen

Sum of Multiplication of column values in cell array

3 Ansichten (letzte 30 Tage)
Tha saliem
Tha saliem am 4 Jan. 2018
Kommentiert: Jan am 4 Jan. 2018
hey i have a cell array x
x{1,1}= {[ *3*,1,6.9,3.6,4,2.3,3,5,4.12],[ *3*,1,4,3,4,2,3.4,5,4],[ *3*,1.9,4,9.21,4,2.2,3,5,4.2],[ *2*,1.8,3.8,2,4,2.1,4,5,4.1]}
x{2,1}= {[1,1,5,3.6,4,2.3,3,2,4.12],[3,4,4,3,4,2,8,5,4],[1,5,4,7,4,2.9,3,5,4.2],[3,1.9,4.8,2,4,2.1,5,5,6]}
and similarly other elements x{3,1} x{4,1} etc. And other array y:
y= {[1,2,1.2,0.2];[0.32,0.42,0.4,0.07]}
I want to take each col value one by one and multiply it with the corresponding value in y and then add them all. Like this:
(3*1) + (3*2) + (3*1.2) + (2*0.2) [3,3,3,2 are bold values in x{1,1}]
and similarly take 2nd col of each element of x{1,1} and multiply it with corresponding values of y{1,1} and add them. When it comes to x{2,1}, it will be multiplied with y{2,1}.
Please suggest any efficient way of doing this without using multiple loops. Thank You.
  1 Kommentar
Tha saliem
Tha saliem am 4 Jan. 2018
(*3*) means bold text (i think its code box so it didn't worked )

Melden Sie sich an, um zu kommentieren.

Akzeptierte Antwort

Jan
Jan am 4 Jan. 2018
It is much easier to work with multi-dimensional arrays instead of nested cells. The cell arrays require loops for numerical operations, such that they are a bad choice, if you want to avoid loops. But you can convert the data:
Result = cell(size(x));
for k = 1:numel(x)
Result{k} = y{k} * cat(1, x{k}{:});
end
The actual calculation is a simple matrix multiplication.

Weitere Antworten (2)

Birdman
Birdman am 4 Jan. 2018
Additional approach to Jan's answer(I tried to eliminate the loop)
a=cell2mat(x{1,1}.');
b=cell2mat(y);
Then the rest is just a matrix calculation, as Jan said.
For instance, what you asked in the question is calculated as:
b(1,:)*a(:,1)
Hope this helps.
  2 Kommentare
Tha saliem
Tha saliem am 4 Jan. 2018
A good approach. Thank You @Birdman.
Jan
Jan am 4 Jan. 2018
@Birdman: Exactly. +1. If the intermediate arrays are not huge, this is the most efficient approach.

Melden Sie sich an, um zu kommentieren.


Guillaume
Guillaume am 4 Jan. 2018
What is the reason for the cells of x to be themselves cell arrays? Due to your multiplication requirements each vector in these subcells must be the same length. Therefore they'd be better stored as a 2D matrix instead, i.e.:
x{1, 1} = [3,1,6.9,3.6,4,2.3,3,5,4.12;
3,1,4,3,4,2,3.4,5,4;
3,1.9,4,9.21,4,2.2,3,5,4.2;
2,1.8,3.8,2,4,2.1,4,5,4.1];
x{2,1}= [1,1,5,3.6,4,2.3,3,2,4.12;
3,4,4,3,4,2,8,5,4;
1,5,4,7,4,2.9,3,5,4.2;
3,1.9,4.8,2,4,2.1,5,5,6];
You can transform your current x in the above x with
x = cellfun(@(c) vertcat(c{:}), x, 'UniformOuput', false);
With that storage, then your problem becomes a simple matrix multiplication of y cells with the x cells, which can be achieved with a single cellfun
result = cellfun(@mtimes, y, x, 'UniformOutput', false);

Kategorien

Mehr zu Matrix Indexing finden Sie in Help Center und File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by