在ismember
内使用splitapply
时,如何访问slitapply
的两个参数?
ismemebr
仅返回每个组的标量值,因此为了计算每个组的非标量值(由ismember
的第一个参数返回),必须包含匿名函数(in这个案例{}
)在大括号splitapply
内返回一个单元格数组。
但是现在,当我向Output argument "varargout{2}" (and maybe others) not assigned during call to
"@(x,y) {ismember(x,y)}"
提供两个输出参数时,我收到一个错误:
ismember2cell
添加1
我可以创建另一个函数,例如ismember
,它将应用function [a, b] = ismember2cell(x,y)
[a,b] = ismember(x,y);
a = {a};
b = {b};
end
并将输出转换为单元格数组:
$('#iframe1',window.parent.document).attr('src',$('#iframe1',window.parent.document).attr('src'));
但也许有一个解决方案并不需要这种解决方法。
答案 0 :(得分:3)
一个可能更快的选择就是通过将数据拆分为单元格数组(使用splitapply
或mat2cell
等函数)然后使用{来完成accumarray
已经在幕后做的事情。 {3}}将您的功能应用于它们。使用cellfun
可以轻松捕获多个输出(例如来自cellfun
)。例如:
% Sample data:
A = [1 2 3 4 5];
B = [1 2 1 5 5];
G = [1 1 1 2 2]; % Group index
% Group data into cell arrays:
cellA = accumarray(G(:), A(:), [], @(x) {x(:).'}); % See note below about (:).' syntax
cellB = accumarray(G(:), B(:), [], @(x) {x(:).'});
% Apply function:
[Lia, Locb] = cellfun(@ismember, cellA, cellB, 'UniformOutput', false);
注意:我的示例数据是行向量,但在将它们传递给accumarray
时,我必须使用ismember
将它们重新整形为列向量(它需要列) 。一旦分配到单元阵列中,矢量的每个部分仍然是列向量,我只想将它们保持为行向量以匹配原始样本数据。语法(:).'
是冒号重塑,后跟colon operator,无论x
的形状如何,都会确保行向量。在这种情况下,我可能刚刚使用.'
,但我已经养成了从不假设变量形状的习惯。
答案 1 :(得分:0)
我找不到全局解决方案,但the accepted answer of this post帮助我为您的问题定义辅助函数:
function varargout = out2cell(varargin)
[x{1:nargout}]=feval(varargin{:});
varargout = num2cell(x);
我认为你可以成功致电
splitapply(@(x,y) out2cell(@ismember, x, y), A, B);