【问题标题】:Finding correct index value for matrix in Matlab using meshgrid使用meshgrid在Matlab中找到正确的矩阵索引值
【发布时间】:2015-07-09 16:33:32
【问题描述】:

我正在尝试构建一个代码,其中不针对某些特定值计算方程式。我有一个网格网格,其中 x 和 y 有几个值,我想包含一个 for 循环,该循环将为网格网格中的大多数点计算一些值,但我试图在该循环中包含一个条件,如果这些点有一个指定索引,不计算该值。在我的第二组 for/if 循环中,我想说对于 i 和 k(行和列)的所有值,除了指定的 i 和 k 值(在 if环形)。我现在正在做的事情不起作用......

我得到的错误是: The expression to the left of the equals sign is not a valid target for an assignment.

这是我目前的代码。我真的很感激对此的任何建议!提前致谢

U_i = 20;            
a = 4;               

c = -a*5;            
b = a*10;           
d = -20;             
e = 20;               

n = a*10;           

[x,y] = meshgrid([c:(b-c)/n:b],[d:(e-d)/n:e]');

for i = 1:length(x)
    for k = 1:length(x)
        % Zeroing values where cylinder is
        if sqrt(x(i,k).^2 + y(i,k).^2) < a
            x(i,k) = 0; 
            y(i,k) = 0;
        end 
    end
end

r = sqrt(x.^2 + y.^2);  
theta = atan2(y,x);
z = zeros(length(x));
phi = zeros(length(x));

for i = 1:length(x)
    for k = 1:length(x)
         if (i > 16 && i < 24 && k > 16 && k <= length(x))
             z = 0;
             phi = 0;
         else
             z = U_i.*r.*(1-a^2./r.^2).*sin(theta);         % Stream function   
             phi = U_i*r.*(1+a^2./r.^2).*cos(theta);        % Velocity potential 
         end
    end
end

【问题讨论】:

  • 逻辑语句需要使用==,而不是=。话虽这么说,该位置的if 语句不起作用,它需要扩展(例如i &gt; a &amp;&amp; i &lt; b &amp;&amp; k &gt; c &amp;&amp; k &lt; d 或其他)。将来请发布完整的错误消息和堆栈跟踪,以便其他人更容易找到问题区域。
  • 您对如何重写该 if 语句有什么建议吗?我最初确实有逻辑陈述,但因为那也不起作用,所以我想我改变了它!编辑帖子以现在包含它们。
  • 我编辑了我的原始评论,可能在您输入的时候。如何重写它取决于循环的意图。
  • 好的,谢谢。代码现在运行,但似乎并没有将这些特定值保持为零..
  • 使用the debugger 浏览您的代码

标签: matlab indexing


【解决方案1】:

问题中的原始代码可以重写,如下所示。请注意ind(17:24,:) 行,因为您的编辑现在不包括 24,而您原来的问题包括 24。

U_i = 20;            
a = 4;               

c = -a*5;            
b = a*10;           
d = -20;             
e = 20;               

n = a*10;           

[x,y] = meshgrid([c:(b-c)/n:b],[d:(e-d)/n:e]');

ind = find(sqrt(x.^2 + y.^2) < a);
x(ind) = 0;
y(ind) = 0;

r = sqrt(x.^2 + y.^2);  
theta = atan2(y,x);

ind = true(size(x));
ind(17:24,17:length(x)) = false;

z = zeros(size(x));
phi = zeros(size(x));
z(ind)   = U_i.*r(ind).*(1-a^2./r(ind).^2).*sin(theta(ind));   % Stream function   
phi(ind) = U_i.*r(ind).*(1+a^2./r(ind).^2).*cos(theta(ind));   % Velocity potential 

【讨论】:

  • 谢谢,这几乎可行,但我不确定如何调整行,因为现在它使第 17 列之后的所有行都为零,但我需要保留除第 17-24 行之外的所有值
  • 代码现在确保第 17 到 24 行(包括边界)为零,第 17 到 41 列(包括边界)为零。 41 因为那是length(x)。也许您有副作用,因为您首先在某些值上将 xy 归零。那么r 为零,因此zphi 也是如此。
  • 好的,但这仍然无法正常工作,因为它将 17 之后的每一列和每一行都归零。我需要将所有列和行中的值保留到指定区域。想象一个向下 5 或 6 行并延伸到域末尾的区域,但仍应计算其余值(在这些列中的其余行中)。我不确定如何修改您的建议以更正此问题
  • @user3460758:我不知道你到底是什么意思......看图片here,告诉我你想要哪个原则。 1 表示已计算值。 0 表示该值将保持为零,无需计算。如果正确的原理不在列表中,请给我一个例子。
  • 嗨,马特,抱歉耽搁了,但这些都不是我想要的。这是我的意思的链接tiikoni.com/tis/view/?id=57271dd
猜你喜欢
  • 1970-01-01
  • 2013-09-13
  • 2015-07-10
  • 2018-02-10
  • 1970-01-01
  • 2013-09-12
  • 1970-01-01
  • 2015-06-10
  • 2013-04-13
相关资源
最近更新 更多