【问题标题】:How to create an array in Matlab but run a function at the same time?如何在 Matlab 中创建一个数组但同时运行一个函数?
【发布时间】:2012-09-28 18:23:42
【问题描述】:

我正在尝试使用正在运行的函数中的值填充数组。在这个函数中,我将变量z20.01 的增量从0 更改为0.99。同时我想用这些值填充一个数组。我尝试了一个while循环和一个for循环。如何只用一个 for 循环来写这个?

我的代码:

Ys = y(2000);
Mp = ((max(y)-Ys)/Ys)*100;
[max, i] = max(y);
tp = t(i);
z = sqrt(((log(Mp))^2)/((pi*pi)+(log(Mp))^2));


%Given Equations
wd = pi/tp;
wn = wd/(sqrt(1-(z*z)));
ts = 4.6/(z*wn);
tr = 1.8/wn;

%for loop for z from 0 to 0.99
for i = 1:100;
   for z2 = 0:0.01:0.99
      %tr*wn = Fa
      Fa(i) = 2.917*z2^2 - 0.4167*z2 + 1;
      i = i + 1;
      if i >= 100;
          break;
      end
    end
end

find_zeta = interp1(Fa, 1.8);

disp(Fa);
disp(find_zeta);

我遇到的错误:我的数组中只有1s。

【问题讨论】:

    标签: arrays matlab for-loop


    【解决方案1】:

    您可以在“矢量化”matlab 语句中不使用循环来完成此操作

    z2 = 0:0.01:0.99;
    Fa = 2.917*z2.^2 - 0.4167.*z2 + 1;
    

    首先,计算您需要的z2 值。接下来,逐个元素地对向量进行操作(note .^ 语法)计算 Fa。 ^.^ 运算符之间存在根本区别,您真的很想知道区别。通常,您可以将. 添加到运算符,这意味着它将适用于数组的各个标量元素。 Read about matrix and array operators here。例如:

    A = rand(10);
    B = rand(10);
    % matrix multiplication
    C=A*B; 
    % element by element multiplication
    C=A.*B
    

    您收到的投诉仅意味着您的工作效率低下。由于 matlab 事先不知道Fa 的大小,因此每次附加到它时都需要重新分配数组。还是可以用的,就是效率低。

    【讨论】:

      【解决方案2】:

      matlab 中的索引从 1 开始,而不是像在其他编程语言中那样从 0 开始

      您得到的错误是关于预分配数组。将Fa = zeros(1,100); 添加到脚本的开头,它将消失。

      Fa = zeros(1,100);
      i = 1;
      for z2 = 0:0.01:0.99
         Fa(i) = 2.917*z2^2 - 0.4167*z2 + 1;
         i = i +1;
      end
      

      在另一个答案中建议使用“矢量化”是更可行的方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-21
        • 2020-01-17
        • 1970-01-01
        • 2019-12-20
        • 1970-01-01
        相关资源
        最近更新 更多