MATLAB:在SPLITAPPLY中使用时从ISMEMBER返回两个参数

时间:2017-11-06 11:02:03

标签: matlab cell-array split-apply-combine

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'));

但也许有一个解决方案并不需要这种解决方法。

2 个答案:

答案 0 :(得分:3)

一个可能更快的选择就是通过将数据拆分为单元格数组(使用splitapplymat2cell等函数)然后使用{来完成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);