【问题标题】:error with an assignment A(I) = B, the number of elements in B and I must be the same赋值错误 A(I) = B,B 和 I 中的元素数必须相同
【发布时间】:2015-07-10 15:21:08
【问题描述】:

我将数据集保存为 .mat,我正在尝试求解未知变量 Ga 和 Ta 的非线性方程组。我正在使用 fsolve 来解决它,相关代码的一部分是:

function F = msabase(x)
load ('matlab.mat');
Ta = x(1);
Ga = x(2);
util_a = exp(lamda.*(alpha_a - cost - w.*log(Ga)));
util_t = exp(lamda.*( - 2.5 - w.*log(2*0.80)));
F(1) = Ga - c0.*(1.+c1.*(Ta./cap).^c2).*d;
F(2) = Ta - sum.*(util_a/(util_a+util_t));

在数据集的每一行中,给出了所有其他变量的值,即 lamda、alpha_a、cost 等。在给定代码的第 7 行中,我收到错误消息“在赋值 A(I) = B 中,B 中的元素数和 我一定是一样的” 我无法理解为什么,因为它应该是一个元素一个元素的操作。

【问题讨论】:

    标签: matlab


    【解决方案1】:

    您收到该错误是因为您试图将元素的向量/矩阵分配给F中的单个槽。存在维度不匹配,因为您试图将多个值映射到 F 中的单个空格中,这最终是您收到错误的原因。

    我的一个建议是使用元胞数组或创建一个二维矩阵来存储您的值。如果您更喜欢元胞数组方法,每个元胞都会存储所需的计算,如下所示:

    F = cell(2,1);
    
    F{1} = Ga - c0.*(1.+c1.*(Ta./cap).^c2).*d;
    F{2} = Ta - sum.*(util_a/(util_a+util_t));
    

    然后要访问正确的插槽,请执行F{1}F{2}。如果您想要 2D 矩阵方法,您可以通过执行以下操作将两个计算连接到一个矩阵中:

     F = [Ga - c0.*(1.+c1.*(Ta./cap).^c2).*d; Ta - sum.*(util_a/(util_a+util_t))];
    

    这是假设每个结果都是一个单行向量,因此这将产生一个二维矩阵,其中每一行都是所需的结果。我不确定每个计算的大小,因此为了使事情保持一致,我将确保两行代码都是行向量:

    F1 = Ga - c0.*(1.+c1.*(Ta./cap).^c2).*d;
    F2 = Ta - sum.*(util_a/(util_a+util_t));
    F = [F1(:).'; F2(:).'];
    

    【讨论】:

    • 是的,你的假设是正确的,每个结果都是一个单行向量。有没有可用的链接可以帮助我更多地了解如何构建类似于你所展示的数组
    • @sayandesarkar - 当然可以。 MathWorks 上有详细记录:mathworks.com/help/matlab/math/…
    【解决方案2】:

    尝试在分配之前预分配F。如果您知道 F 是 2×1 向量,请在第 7 行之前的某处插入 F = zeros(2,1)。如果您对 F 的维度一无所知,请将其初始化为空矩阵并附加到它:

    F = []
    F = [F; (Ga - c0.*(1.+c1.*(Ta./cap).^c2).*d)];
    F = [F; (Ta - sum.*(util_a/(util_a+util_t)))];
    

    请注意,MATLAB 在附加向量/矩阵方面并不是特别有效,因此请尽可能进行预分配。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-27
      • 1970-01-01
      • 1970-01-01
      • 2016-04-26
      相关资源
      最近更新 更多