如何在GUI函数中切片数组?

时间:2013-09-16 16:44:34

标签: arrays matlab user-interface slice

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

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

第96行引用此代码:

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

Temp看起来像这样

temp = 

1    1    1    1    2    1    1    1    1

并且handle.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乘64的双打数组,我可以用image()绘制。

可能与这些问题有关,但这些问题涉及到parfor困难,似乎没有回答我的问题:

matlab-parfor-slicing-issue

index-inside-parfor-slicing

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

2 个答案:

答案 0 :(得分: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数组的下标。这很奇怪,但有时也很方便。

答案 1 :(得分:1)

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