因为我试图让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困难,似乎没有回答我的问题:
我现在也正在阅读the advanced topics以获取切片变量。虽然仍然没有看到我做错了什么,所以任何帮助或解释仍然会非常感激。谢谢!
答案 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)
。
这是一个不需要squeeze
或eval
的解决方案。它利用单元数组的{:}
语法的逗号分隔列表输出,以及在最后一个下标维度上应用线性索引的功能。
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