はじめに
Igor Proって日本語の情報少ないですよね。
1次元の配列 (colMaskwv、0と1で指定) によって指定された列のみを行列から取り出して新しい行列を作りたかったのですが、うまくいかなかったので作ってみました。
もっと簡単な方法がある気がするのですが、見つけられず
pythonならファンシーインデックスですぐできるのにと思いながら作りました。
もっと簡単な方法をぜひ誰か教えてください・・・・!
2023/01/12
@kitaka様にコメントいただき、より簡潔なコードをご教示いただきました。
コメント欄をご覧ください。
kitaka様、大変ありがとうございます・・・!
参考
前半はwavemetricsのForumに載っているコードを参考にさせていただきました
https://www.wavemetrics.com/node/20893
コード
Function/wave remove_blank_cols(inwave)
wave inwave
matrixop/o/free inwaveCopy = inwave^t
variable numOfRows = dimsize(inwaveCopy,0)
variable numOfCOls = dimsize(inwaveCopy,1)
Redimension /N=(numOfRows*numOfCOls) inwaveCopy
WaveTransform zapNaNs inwaveCopy
variable numOfRowsChanged = numpnts(inwaveCopy)/numOfCOls
Redimension /N=(numOfRowsChanged, numOfCOls) inwaveCopy
matrixop/o destWave = inwaveCopy^t
return destWave
end
Function/wave extractCols(wv, colMaskwv)
wave wv, colMaskwv
matrixop/o/free inwave = wv+1
matrixop/o/free extractedWave = scalecols(inwave, colMaskwv)
matrixop/o/free extractedWave = replace(extractedWave, 0, NaN)
wave destWave = remove_blank_cols(extractedWave)
matrixop/o destWave = destwave-1
return destWave
end
使い方
使い方は単純で、対象行列をwv, 抽出したい列を1, 削除したい列を0で指定した配列をcolMaskWvに入れます。
wv =
\begin{pmatrix}
0 & 1 & 2 \\
0 & 1 & 2 \\
0 & 1 & 2
\end{pmatrix}\\
\\
colMaskWv =
\begin{pmatrix}
0 & 1 & 1 \\
\end{pmatrix}
なら
destWave =
\begin{pmatrix}
1 & 2\\
1 & 2 \\
1 & 2
\end{pmatrix}
です
colMaskWvを適当に変更すれば、任意の組み合わせの列を取り出せるはずです
ちなみにマニュアルを見るとWavetransformのところでmultidimensionの時にはmatrixopのreplaceNaNsを使いなさいと書いてありますが、こちらでは置換するだけなのでNaNの行や列を削除することができませんでした。
おわりに
Igor Proで行列から特定の複数列を取り出して新しい行列にするスクリプトを作ってみました。
本当にこれ、ほかの方法ないんでしょうか?? 私の探し方が下手なだけなきがすごくしています。。。