如何将矩阵中的列乘以不同的常量(每列),然后在Matlab中将每一行相加?

时间:2014-09-30 19:02:50

标签: matlab matrix

对于一个项目,我有一定数量的订单进来,我正在尝试计算每个总数的总数。在将矩阵的每列(每个项目的数量)乘以设定常数(每个价格与矩阵中的不同列相关)之后,我想将每行中的所有单元格相加,以便我可以找到每个总价格每个订单。这是我到目前为止的代码:

%A is the matrix of item types and quantities of each item

%A = |OrderNumber  Kitkat   Hershey   Reese's .....  Rolo|
     |  1            3        4        2      .....   4  |
     |  2            4        10       9      .....   2  |
     |  3            7        8        0      .....   0  |
     |.....         ....     ...      ...     ..... .....|

candyPrice = [3 4 3 ........];
orderTotalPrice = {}; 
for i = 1:10
  for k = 2:10
    orderTotalPrice(i) = A(i,k).*candyPrice(k)+orderTotalPrice;        
end
end

当我运行此代码时,我收到错误消息,说"未定义的功能'加上'输入参数类型为' cell'。"

3 个答案:

答案 0 :(得分:4)

对于问题标题:

  

" 将矩阵中的列乘以不同的常量(每列),然后在Matlab中对每一行求和?"

一个符号,*将执行此操作,(在评论中提到为矢量矩阵产品)

您要计算的内容相当于

orderTotalPrice = candyPrice*matA

其中candyPrice是1xn向量,matA是nxm(n是项目类型的数量,m是订单数量......)

对于OP的代码

要将此方法与单元格A一起使用,我们需要

  • 删除订单号和标题
  • 从单元格转换为矩阵
  • 转置(为numitemtypes x numorders)

所以执行所有这一切的单行是:

orderTotalPrice = candyPrice*cell2mat(A(2:end,2:end)).'

带有测试数据

A = 

    'orderNo'    'item1'    'item2'    'item3'
    [      1]    [    2]    [    1]    [    3]
    [      2]    [    3]    [    2]    [    3]
    [      3]    [    1]    [    3]    [    3]


candyPrice =

   100    10     1

我们得到了

orderTotalPrice = candyPrice*cell2mat(A(2:end,2:end)).'

orderTotalPrice =

   213   323   133

答案 1 :(得分:0)

使用p1 = bsxfun(@times,A(:,2:end),candyPrice)计算所有产品的价格。每种糖果的总订单价格为p2 = sum(p1,2),总价格为p = sum(p2)


或者,您可以像这样调整代码:

candyPrice = [3 4 3 ........];
orderTotalPrice = zeros(1,10);
for i = 1:10
    for k = 2:10
        orderTotalPrice(i) = A(i,k).*candyPrice(k)+orderTotalPrice(i);
    end
end
total = sum(orderTotalPrice);

答案 2 :(得分:0)

首先,orderNumber不应该与任何东西相乘,否则就没有任何意义。

因此,我认为size(candyPrice,2)等于size(A,2)-1

然后矢量化代码如下:

orderTotalPrice = sum(repmat(candyPrice,[size(A,1) 1]).*A(:,2:end),2);