【问题标题】:Avoid restarting for-loop避免重启for循环
【发布时间】:2017-10-02 11:03:05
【问题描述】:

我有一个包含图片的文件夹。对于每张图片,我想取最大值并将其添加到一个新矩阵中(我创建了一个零矩阵,因此零将被新值替换)。

这是我的代码:

function handles = original(hObject, eventdata, handles)

handles.weed=handles.selected;
pic=imread(handles.me);
handles.pic=pic;
axes(handles.axes1)
imshow(pic);
num=max(pic(:))
zeroMat = zeros(1,70);
handles.zeroMat = zeroMat;

for i =1:3
    if zeroMat(1,i)~= 0;
        i=i+1
    else
        zeroMat(1,i)=num
        break
    end
end

zeroMat(1,i)=num

每次我选择一张新图片时,zeromat 都会重新启动到一个新的零矩阵。我知道它为什么会发生,但不幸的是我不知道如何克服它。

这是输出:

图片1:

zeroMat =

  Columns 1 through 20

   255     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 21 through 40

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 41 through 60

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 61 through 70

     0     0     0     0     0     0     0     0     0     0

图片2:

  Columns 1 through 20

   203     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 21 through 40

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 41 through 60

     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0

  Columns 61 through 70

     0     0     0     0     0     0     0     0     0     0

【问题讨论】:

  • 您应该修改问题并进行更正。此外,您可能不想在 for i = 1:3 循环中使用 i = i+1
  • @Steve 为什么不呢?如果它不为零,我想跳到下一个索引,问题在于矩阵在 foor 循环之后回到零垫
  • 在这种情况下你应该使用continue或者什么都不用;就目前而言,i 只是在循环的下一步被覆盖,除非退出循环。
  • 您是否正在循环浏览 70 张图片,并希望将 i-th 图片中的最高像素值保存在 zeroMat(1,i) 中?
  • @Steve 我点击了 gui 的图片,然后我希望每次都接收一个最大值,最后得到一个最大值的矩阵

标签: matlab for-loop matrix restart


【解决方案1】:

我不知道这个函数是如何被调用的,所以不能建议如何改变逻辑。粗略的解决方法可能是包含该行

if ~isfield(handles,'zeroMat')
    handles.zeroMat = zeros(1,70);
end % if

它应该在函数第一次运行时创建handles.zeroMat。然后你可以做类似的事情

firstNonzero = find(handles.zeroMat > 0, 1, 'first'); % 'first' not needed, default
handles.zeroMat(firstNonzero) = max(pic(:));

【讨论】:

  • 错误使用 find 第二个参数必须是一个正标量整数。
  • @Yasmin 抱歉,已修复
  • 对不起,但它不起作用,输出是一个 zeromatrix .. 我将再次解释 - 我通过列表单击图片,我希望每次点击都获得一个矩阵 ->获取最大值 -> 获取具有所有最大值的新矩阵
  • @Yasmin 也许您可以使用详细信息/代码编辑您的问题,让我们重新创建您单击矩阵的行为
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
  • 2023-03-27
  • 2012-06-25
  • 2020-03-10
  • 1970-01-01
  • 2017-08-27
相关资源
最近更新 更多