如何将计算中的答案保存到单元格数组中

时间:2017-11-01 11:35:59

标签: matlab vectorization

我正在尝试使用两个初始变量计算一个值,但最后的答案是被覆盖并且只输出最终值。我已经尝试为变量使用两个嵌套的for循环,但这会产生类似的响应。

% inc = [0:1:360];
% axis = [0:416.6*10^3:15*10^7];
e = [];
Re = 3390*10^3;
om = 270;`
J2 = 1.95545*10^3;
J3 = 3.14498*10^-5;
J4 = -1.53774*10^-5;
J22 = 6.30692*10^-5;

for inc = 0:1:360
    for a = 0:416.6*10^3:15*10^7
        E1 = ((6-169/2*sin(inc).^2+365/48*sin(inc).^4)
        E2 = 35*J4/18*(J2)^2*(12/7-93*sin(inc).^2+21/4*sin(inc).^4);
        E = E1-E2;

        e1 = (J3*Re/2*J2*axis).*sin(inc).*sin(270);
        e2 = (1-(3*E*J2*Re^2/axis.^2)*(5.*(sin(inc).^2)-4));
        e = -(e1/e2);
    end
end

我试图将结束e值设为一个单元格,以便我可以根据变量inc和axis绘制它。

另外,如果我的公式的语法错误,这里是我试图自动化的公式。

enter image description here

,其中

enter image description here

感谢您提供有关如何解决此问题的任何帮助或建议。

3 个答案:

答案 0 :(得分:1)

您可以对代码进行矢量化并获得没有循环的解决方案。正如@ schnobi1所说,你应该更多地关注分子和分子和分母的乘法。

Re = 3390*10^3;
om = 270;
J2 = 1.95545*10^3;
J3 = 3.14498*10^-5;
J4 = -1.53774*10^-5;
J22 = 6.30692*10^-5;
inc = 0:360;
a = 0:416.6*10^3:15*10^7;
E1 = (6-169/2*sin(inc).^2+395/48*sin(inc).^4);    % 1 x 361 vector
E2 = 35*J4/18*(J2)^2*(12/7-93*sin(inc).^2+21/4*sin(inc).^4);    % 1 x 361 vector
E = E1-E2;                                       % 1 x 361 vector
e1 = [sin(270)*(J3*Re./(2*J2*a))].'*sin(inc);    % vector multiplication, this is now 361 x 361 matrix
e2 = 1-([3*J2*Re^2./a.^2].'*(E./(5*(sin(inc).^2)-4)));   % vector multiplication, this is now 361 x 361 matrix

e = -(e1./e2);

结果是361 x 361矩阵,其中行根据a的值,而列根据inc的值。 例如,对于第4位的a和第12位的inc,您将获得:

a(4)=

     1249800

inc(12)=

    11

e(4,12)=

  -8.9796e-18

答案 1 :(得分:0)

您的实施中存在一些错误。请仔细查看您的所有条款(例如395/48是您的365/48)。括号有时也设置不正确。我希望我发现所有这些问题,但请再次仔细检查。

比使用预定义变量“axis”。它用于绘图,定义为[0 1 0 1]。这就是您的代码无法正常工作的原因。 所以请试试这个。

%% Clearing
clc; clear all; close all

%% Variables
e = [];
Re = 3390*10^3;
om = 270;
J2 = 1.95545*10^3;
J3 = 3.14498*10^-5;
J4 = -1.53774*10^-5;
J22 = 6.30692*10^-5;

inc=1
a = 1

%% Calculate e
for inc = 0:1:360
    for a = 0:416.6*10^3:15*10^7
        E1 = 6-(169/12)*sin(inc).^2 + 395/48*sin(inc).^4;
        E2 = 35*J4/(18*J2^2)*(12/7-(93/15*sin(inc).^2+21/4*sin(inc).^4));
        E = E1-E2;

        e1 = (J3*Re)/(2*J2*a) * sin(inc)*sin(270);
        e2 = 1-((3*J2*Re^2*E)/(a^2*(5*sin(inc)^2-4)));
        e = [e, -(e1/e2)];
    end
end

要将您的e存储到矩阵中,您只需使用e = [e, -(e1/e2)];即可。但请注意,这不是一个“好方法”。因为在每次运行中,e都会被复制,这会让它变慢。从零开始分配e并稍后写入其中的值会更好,更快。

答案 2 :(得分:0)

你可以在你要更新的所有矢量点上使用直接索引。循环使用示例e1(Inc)=您的计算; e2(Inc)=你的计算; E(公司)= - (E1(INC)/ E2(公司));但是它会很慢,但你可以期待