bsxfun
非数値データに相当するものはありますか?
たとえば、2 つのセル配列に格納されている文字列のすべてのペアを比較したいとします。
>> a = {'aa', 'bb', 'cc'};
>> b = {'dd', 'aa'};
>> bsxfun( @strcmp, a, b' ); % not working for cells :-(
私はRody's solutionが好きですが、次のような回避策を実行することもできます:
ia=(1:length(a)).'; ib=1:length(b);
a=a(:);
bsxfun(@(ii,jj) strcmp( a(ii),b(jj) ) ,ia, ib);
残念ながら、セル配列に相当するものはありません:-(
私が見る限り、次のいずれかを実行できます。
mAryCellFcn
csxfun
独自の関数をロールします。たとえば、任意の次元の入力 (bsxfun
もちろん の制限の下で) と任意のバイナリ関数 に対して機能するRobert のアイデアの変形を次に示しfunc
ます。
function C = mybsxfun(func, A, B)
idx_A = reshape(1:numel(A), size(A));
idx_B = reshape(1:numel(B), size(B));
C = bsxfun(@(ii, jj)func(A(ii), B(jj)), idx_A, idx_B);
関数が cell 配列全体を要素ごとに操作できる場合は、最初に cell 配列に対してシングルトン展開を実行してから、それらを関数に直接渡すことができますfunc
。
mask = bsxfun(@or, true(size(A)), true(size(B)));
idx_A = bsxfun(@times, mask, reshape(1:numel(A), size(A)));
idx_B = bsxfun(@times, mask, reshape(1:numel(B), size(B)));
C = func(A(idx_A), B(idx_B));
後者の方法はfunc
、cell 配列のベクトル化された操作用に最適化されている場合、より高速になる可能性があります。
エラーメッセージが示すように、ブロードキャストは数値型に対してのみ機能します。他の可能な代替手段は次のとおりです。
a = {'aa', 'bb', 'cc'};
b = {'dd'; 'aa'};
%# obviously doesnt work
%#bsxfun(@strcmp, a, b)
%# do the singleton expansion ourselves
strcmp(repmat(a,size(b)), repmat(b,size(a)))
%# if you dislike REPMAT, we can use Tony's trick
strcmp(a(ones(size(b)),:), b(:,ones(size(a))))
%# we could also use CELLFUN
cell2mat(cellfun(@(s)strcmp(a,s), b, 'UniformOutput',false))
どうですか
[str,ia,ib] = intersect(a,b)
?