私はmatlabでコマンドfindをかなり多く使用していますが、これをFortranでスマートに変換して、配列のスライスを抽出する方法を考えています。matlabでは、論理またはインデックスのいずれかでスライスできますが、Fortranでは、スライスするためにインデックスが必要です。私は組み込みサブルーチンpacketalを知っていますが、それらを使用したことはありません。また、大きな行列を扱っているので、メモリの重複は避けたいと思います。スライスした行列をサブルーチン内で操作したい。配列のスライスが複製されていないことをどこかで読んだことがあります。しかし、これがmatlabでどのようにスライスされたかはわかりません。matlabでは、一部の割り当てが透過的であるため、私も困惑しています。
以下の例を再現する方法を知りたいのですが、メモリ内の内容を複製していないことと、実際に複製するのがエレガントであることを確認してください。そうでなければ、スライスすることを忘れて、マトリックス全体を送信し(参照によるため)、インデックス配列をループします...
Matlabの例1:単に検索を再現する
v=[1 2 3 4];
I=find(v==3);
Matlabの例2:
m=rand(4,4);
bools=logical([ 1 0 0 1]);
I=find(bools==1);
% which I could also do like:
I=1:size(m,1);
I=I(bools);
for i=1:length(I)
% here dealing with m(I(i)),:) and do some computation
% etc.
例3:m(I、:)でサブルーチンを呼び出すだけですが、スライスに直接ブール値を使用します
foo( m(bools, :) , arg2, arg3 )
よろしくお願いします!