私は大きな行列を持っていますが、大きな行列全体に渡って動くスライディングウィンドウから取り出した小さな行列を抽出する必要がありますが、行列は変更されないので、新しいコピーを作成せずにサブ行列を抽出したいのですが、代わりに大きな行列の一部を指すCポインタのように機能します。これどうやってするの?どうもありがとうございました、私を助けてください:)Matlabでコピーを作成せずに部分行列を抽出する方法
答えて
を私は明示的な一時的な行列を使用しないと高速であり、そしてそれはおそらくないかどうかをテストするためにいくつかのベンチマークをした:
function move_mean(N)
M = randi(100,N);
window_size = [50 50];
dir_time = timeit(@() direct(M,window_size))
tmp_time = timeit(@() with_tmp(M,window_size))
end
function direct(M,window_size)
m = zeros(size(M)./2);
for r = 1:size(M,1)-window_size(1)
for c = 1:size(M,2)-window_size(2)
m(r,c) = mean(mean(M(r:r+window_size(1),c:c+window_size(2))));
end
end
end
function with_tmp(M,window_size)
m = zeros(size(M)./2);
for r = 1:size(M,1)-window_size(1)
for c = 1:size(M,2)-window_size(2)
tmp = M(r:r+window_size(1),c:c+window_size(2));
m(r,c) = mean(mean(tmp));
end
end
end
M
用サイズ100 * 100で:
dir_time =
0.22739
tmp_time =
0.22339
したがって、一時変数を使用すると、コードが読みやすくなり、遅くならないようです。
実際には、あなたのテストの違いは、直接ケースの 'mean'への二重呼び出しにあると思います。もしあなたがtemp caseコードを' mean(mean(tmp)) 'に変更すると、違いはありません。 –
@NoelSeguraあなた、私はあまりにも控えめでした。それを修正するために私の答えを編集しました。 – EBH
この回答では、一般的に「最良の」解決策について説明します。この回答のために、私は、「最高」を重要なパフォーマンスヒットなしに最も読みやすいものとして定義します。 (既存の回答によって部分的に示されている)。
は基本的にあなたがであってもよく、2つの状況がある。
1.あなたは、一般的に最善の解決策は、部分行列を含む一時的な変数を作成することである。このような状況では、あなたの部分行列数回
を使用しています。
A = M(rmin:rmax, cmin:cmax)
あなたを幸せにしません(機能/匿名関数あなたのための行列にインデックスを定義する)、それを回避する方法が、一般的にはあるかもしれません。
M(rmin:rmax, cmin:cmax)
部分行列を使用して、特定の場合のみ1:あなたはあなたの部分行列だけで1時間
はこの場合、最善の解決策は、あなたがコメントで言及まさに一般的である使用
2時間は、それが関数に一度渡されるときです。もちろん、サブマトリックスの内容はその機能で数回使用されるかもしれませんが、それは無関係です。
- 1. MATLAB:ループを使用せずに行列の複数の部分を抽出する
- 2. Cでコピーを作成せずにリストの一部を取得する方法
- 3. 行列を部分的にコピーする方法は?
- 4. Matlabのシンボリック関数の行列を抽出する方法
- 5. matlabの部分行列を "反復"する方法
- 6. URLから部分文字列を抽出する方法
- 7. テキストファイルから部分文字列を抽出する方法は?
- 8. 文字列の部分を抽出する方法
- 9. Powershell - 部分文字列を抽出する方法
- 10. "C:\ fakepath ...."を含む部分文字列の抽出方法
- 11. MATLAB:配列の特定の部分をコピーする
- 12. linux/bashでバイナリファイルのテキスト部分を抽出する方法は?
- 13. matlabの特定の列の条件に基づいて部分行列を抽出します
- 14. 論理条件を満たす行列から各生を抽出する部分行列を作成する方法は?
- 15. Androidスタジオでコピーを作成せずにモジュールをインポートする方法
- 16. C++同じシンボル間で部分文字列を抽出する方法
- 17. 文字列の部分を配列に抽出する
- 18. .txtファイルからデータの列を抽出する方法MATLAB
- 19. ファイルから行を抽出してbashで別の行にコピーする方法
- 20. Matlabの.figから行列を抽出するには?
- 21. XMLから特定の部分を抽出する方法
- 22. WP:余分なページを作成せずにadd_rewrite_rule()を行う方法
- 23. Python pandas extract、文字列の残りの部分を抽出する方法
- 24. NumPyでコピーを作成せずに多次元配列の軸を平らにする方法は?
- 25. WIXブートストラップで文字列の一部を抽出する方法
- 26. bashで文字列の一部を抽出する方法は?
- 27. 文字列から部分文字列を抽出する
- 28. CUDAで配列の部分を抽出して設定する
- 29. 行列を等しい部分に分割する方法は?
- 30. ダッシュボードを公開せずにデータをCSVファイルに直接抽出するためのTableau Dashboardで抽出ボタンを作成する方法
MATLABにはポインタはありませんが、あなたのサブマトリックスの境界を追跡し、この 'M(rmin:rmax、cmin:cmax)'のような元の行列を参照することができます – jodag
@jodagしかし、 M(rmin:rmax、cmin:cmax)は新しい行列を作成しませんか?そして、M(rmin:rmax、cmin:cmax)を書くのはちょっと冗長です:( –
はい、新しい行列を作成します。そして、おそらく新しい行列は、何があっても部分行列に対して計算が行われると割り当てられます。 – jodag