【问题标题】:Matlab Deciding Output based on matrix conditionMatlab根据矩阵条件决定输出
【发布时间】:2017-10-24 15:09:49
【问题描述】:

所以我有这个矩阵

A=
7

B=
0.34   0.34   0.34
0.50   0.25   0.25

还有这个矩阵

C=
1
1
4
2
3
6
3

使用这条规则:

  • 如果 C=1 那么输出 = sum(A*(B first row) )
  • 如果 C=2 则输出 = sum(A*(B 2nd row) )
  • 如果 C 不是 1 或 2,则输出 = C 值

或一般来说:

  • 如果 B 中存在第 C 行,则输出 = sum(A*(B 的第 C 行))
  • 否则输出 = C 值

所以输出应该是这样的:

output=
7.14
7.14
4
7
3
6
3

我正在尝试使用此代码,但它不起作用

sizeA=size(A,1)
sizeB=size(B,1)
for i=1:sizeB
    if (B(i)<=sizeA)
        Output=sum(repmat(A,1,length(C))'.*B(C,:),2)
    else 
        Output=C(i)
    end
end

【问题讨论】:

  • 您的条件是否取决于B 中的行数?如果存在第三行,是否应该使用它?如果是这种情况,请在您的问题中提及。很好地提出问题通常是找到解决方案的一大步。
  • 是的,它取决于B中的行,所以如果B上有第3行,它也应该被计算

标签: matlab if-statement matrix


【解决方案1】:

正确的代码是:

sizeA=size(A,1);
sizeB=size(B,1);
sizeC=size(C,1);
Output = zeros(size(C)); % preallocate memory for efficiency
for i=1:sizeC
    if C(i)<=sizeB
        Output(i)=sum(A * B(C(i), :));
    else 
        Output(i)=C(i);
    end
end

您还可以通过以下方式避免 for 循环:

% make B of the same size as C
B_ = zeros(size(C)); 
B_(1:size(B, 1)) = sum(B, 2);
% calculate the output
output = C .* (C > size(B, 1)) + A .* B_(C)

请尝试理解代码而不是仅仅使用它。

【讨论】:

    【解决方案2】:

    我简化了一点。它有效。

    for i=1:length(C)
    num=C(i);
    switch num
    case 1
    output(i)=sum(A*B(1,:))
    case 2
    output(i)=sum(A*B(2,:))
    otherwise
    output(i)=C(i);
    end
    end
    
    output =
    
      Columns 1 through 5
    
        7.1400    7.1400    4.0000    7.0000    3.0000
    
      Columns 6 through 7
    
        6.0000    3.0000
    

    【讨论】:

    • 虽然没有明确要求,但这不适用于具有不同行数的一般B矩阵。
    • 不,因为您不会使用额外的行或访问不存在的行。根据他提供的代码,我认为如果B 存在,他想使用该行。
    • 其实取决于B中的行
    猜你喜欢
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多