【发布时间】:2012-06-26 14:06:11
【问题描述】:
这是一个一般性问题,与特定操作无关。我希望能够将任意函数的结果写入元胞数组的元素,而不考虑函数返回的数据类型。考虑这个伪代码:
zout = cell(n,m);
myfunc = str2func('inputname'); %assume myfunc puts out m values to match zout dimensions
zout(1,:) = myfunc(x,y);
这适用于 "inputname" == "strcat" ,例如,假设 x 和 y 是具有适当维度的字符串或字符串单元格。但是如果 "inputname" == "strcmp" 那么输出是一个逻辑数组,并且 Matlab 会抛出一个错误。我需要这样做
zout(1,:) = num2cell(strcmp(x,y));
所以我的问题是:有没有一种方法可以填充单元格数组 zout 而无需测试 myfunc(x,y 生成的变量类型?我应该首先使用struct(如果是,填充它的最佳方法是什么)?
(我通常是 R 用户,我可以使用 list 变量而没有任何痛苦)
编辑:为了简化整体范围,添加以下“要求”:
现在让我们假设,对于返回多个输出的函数,只有第一个需要在 zout 中捕获。但是,当此输出是 N 个值的向量或单元格的向量(即 Nx1 单元格数组)时,这些 N 个值将映射到 zout(1,1:N)。
【问题讨论】:
-
输出参数的数量如何,您要使用的所有函数是否都返回 1 个变量?他们使用
varargout吗? -
@Amro 我想让它尽可能通用,以便函数返回的任何内容(数字、几个数字、字符串、逻辑值)都放在指定的单元格中。示例:
x = 1:4、y = 6、myfunc = atan2,所以zout(1,1:4)(四个单元格)填充了从atan2返回的四个值。 -
@CarlWitthot:我说的是返回的变量数量而不是它们的类型。我问的原因是某些函数只会返回您请求的输出参数。以
unique为例,它最多返回3 个变量,并且无法通过编程方式知道函数的输出数量(定义为function varargout = unique(varargin))。如果您调用nargout('unique'),它会显示-1(减去表示可变参数,因此只报告一个参数) -
@CarlWitthot:只是指出这一点,您的 ATAN2 示例返回一个输出参数而不是四个,尽管它是一个长度为 4 的向量。这就是您正在寻找的行为,每个 数字单独在一个单元格中?
-
@Amro 是的,如果输出是一个向量,那么向量的每个元素都会进入它自己的单元格。如果输出是 Mx1 元胞数组,则每个元胞都成为
zout中的匹配元胞(不是元胞内的元胞)。我正在寻找 DWIM 行为。zout是一个元胞数组的原因是,无论值的类型(数字、逻辑、字符)如何,我都可以将每个单独的值放入其自己的“位置”。
标签: function matlab types return-value cell-array