【问题标题】:How to slice array in GUI function?如何在 GUI 函数中对数组进行切片?
【发布时间】:2013-09-20 21:49:03
【问题描述】:

因为我试图让一个 GUI 元素对我的数组进行切片,所以变量中会有一个 :(冒号)符号。这会给我一个错误:

Error in gui_mainfcn (line 96)
         feval(varargin{:});

第 96 行引用了这段代码:

image(handles.data(1:handles.rows,1:handles.cols, temp))

温度是这样的

temp = 

1    1    1    1    2    1    1    1    1

handles.rows 和 cols 的值都是 64。所以问题似乎是我在 gui 函数中使用了冒号。但是,要切片,我需要使用冒号。我现在的问题是:知道如何解决这个问题吗?

按以下要求澄清

当我在控制台中手动输入时,上面的代码有效。另外当我使用handles.data(:,:,1,1,1,1,2,1,1,1,1),handles.data(1:end,1:end,1,1,1,1 ,2,1,1,1,1),handles.data(1:64,1:64,1,1,1,1,2,1,1,1,1) 等我得到同样的错误gui。手动它们都可以工作并返回一个 64 x 64 的双精度数组,我可以使用 image() 进行绘制。

可能与这些问题有关,但是那些处理parfor困难并且似乎没有回答我的问题:

matlab-parfor-slicing-issue

index-inside-parfor-slicing

我现在也在阅读 the advanced topics 以了解切片变量。仍然没有看到我做错了什么,所以任何帮助或解释仍然会非常感激。谢谢!

【问题讨论】:

  • 您是否碰巧在错误消息附近的任何地方看到文本Function 'subsindex' is not defined for values of class 'cell'.?你的temp 变量是一个单元格,所以你不能用它来索引handles.data。
  • 啊,是的,对不起,我发布了旧形式的 temp。我以前遇到过这个错误,但现在没有了。不管怎么说,多谢拉。我更正了问题中的代码。

标签: arrays matlab user-interface slice


【解决方案1】:

说明

通过将向量 temp 作为第三个索引放入您的数据中,您不会索引更高的维度 - 您会重复索引第三个维度。换句话说,你得到的是handles.data(:,:,[1 1 1 1 2 1 1 1 1]),而不是handles.data(:,:,1,1,1,1,2,1,1,1,1)

解决方案

这是一个不需要squeezeeval 的解决方案。它利用{:} 语法的逗号分隔列表输出和元胞数组,以及在最后一个下标维度上应用线性索引的能力。

ctemp = num2cell(temp); % put each index into a cell
sz = size(handles.data); % i.e. sz = [256 256 1 1 2 1 2]
sliceind = sub2ind(sz(3:end),ctemp{:}); % compute high dim. linear index (scalar)
image(handles.data(:,:,sliceind));

这通过将最后一个下标计算为线性索引来执行只有 3 个下标的 >3D 数组的下标。这很奇怪,但有时很方便。

【讨论】:

  • 我的切片创建了一个 64 x 64 的双精度数组。手动输入代码有效。但是 gui 无法处理 data(:,:,1,1,1,1) 或 data(1:end,1:end,1,1,1,1) 或 data(1:64,1:64,1 ,1,1,1) 等。
  • 我不确定你想做什么,但每个逗号都进入下一个维度。 size(data) 是什么?
  • 是的,每个逗号都转到下一个维度,但结果切片中的唯一维度是索引中具有多个值的维度。范围在切片中创建维度,单个数字是获取范围的位置。 1:64,1:64 就像是说取所有像素,然后所有的 1 和 2 都指向取这些像素的维度。
  • 对不起,也回答你的问题:size(data) = 64 64 1 1 1 1 2 1 1 1 1;大小(数据(:,:,1,1,1,1,2,1,1,1,1))= 64 64;
  • 查看我的更新答案。如果您始终可以依赖维度 1、2 和 7 作为唯一的非单一维度,那么最终的答案会更容易。是这样吗?
【解决方案2】:

提醒有同样问题的人,这个错误不仅可能是由于不知道如何切片,还可能是由于没有正确定义变量:http://www.mathworks.nl/matlabcentral/answers/87417-how-to-slice-inside-gui-without-error-feval-varargin

【讨论】:

    猜你喜欢
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-15
    • 1970-01-01
    相关资源
    最近更新 更多