インスタンスメソッド​の第2出力をcell​funで取得する方法

2 ビュー (過去 30 日間)
Shojiro SHIBAYAMA
Shojiro SHIBAYAMA 2020 年 6 月 17 日
コメント済み: Shojiro SHIBAYAMA 2020 年 6 月 17 日
あるクラス SomeClass のインスタンスメソッドが2つ変数を返すときに、cellに SomeClass のインスタンスを初期化して保存しておいて、cellfunでまとめて実行する方法はありますか?
以下のようなコードを書いています。
X; % some data
objs(:) = {SomeClass()}; % initialize
[~, ret] = objs{1}.predict(X); % predict
% bulk execution
cellfun(@(x)x.predict(X), objs)
例えば load 関数では、出力を構造体で渡すことができるので次のように書くことができます。第2引数の取得とは異なりますが、以下のような挙動を、第2引数でも実行したいです。
filepaths = {'path1', 'path2', 'path3', ...};% file paths
data = cellfun(@(f) {load(f)}, filepaths);
data{1} %=> returns a structure having all variables in `path1` file.
うまく説明できていないかもしれませんがよろしくおねがいします。
解決策(案、あまりやりたくない):
第2出力だけを出力するインスタンスメソッドを定義する
  2 件のコメント
Shojiro SHIBAYAMA
Shojiro SHIBAYAMA 2020 年 6 月 17 日
Shojiro SHIBAYAMA
Shojiro SHIBAYAMA 2020 年 6 月 17 日

サインインしてコメントする。

採用された回答

Shojiro SHIBAYAMA
Shojiro SHIBAYAMA 2020 年 6 月 17 日
次のコードを書くと解決します。
function out = out2(fun, varargin) % gets the second output argument of anonymous function fun
[~,out] = fun(varargin{:}); % fun must have no input arguments
end
あるいは、一般の第N出力に対して
function out = outN(fun, N, varargin)
eval(['[' repmat('~,', 1, N) 'out] = fun(varargin{:});']);
end
と書くといけそうです。
  1 件のコメント
Shojiro SHIBAYAMA
Shojiro SHIBAYAMA 2020 年 6 月 17 日
最終的に、一般のN(>=2)に対して次のように書けます。
function out = outN(fun, N, varargin)
% >> [A,B]=ismember(1,[0,1,2,3,4,5])
% A =
% logical
% 1
% B =
% 2
% >> outN(@ismember,2,1,[0,1,2,3,4,5]) % get the second output
% ans =
% 2
assert(N>=2,"indicate after 1st output");
omit = cell(1, N-1);
omit(:) = {'~'};
ignore = join(omit, ',');
eval(['[' ignore{1} ',out] = fun(varargin{:});']);
end

サインインしてコメントする。

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeMATLAB でのオブジェクト指向デザイン についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!