1
假設我有一個矩陣,使得每行是一個標準的基礎的載體,即每一行包含正好一個如圖1所示,其他列是0八度:標準基向量的表示矩陣
是否有一個方便的方法來創建這樣一個矩陣(即給定一個位置矢量在每行中的位置)?
另外,是否有一種方法我應該代表這樣一個矩陣,以便與倍頻可以在八度更有效地完成?
假設我有一個矩陣,使得每行是一個標準的基礎的載體,即每一行包含正好一個如圖1所示,其他列是0八度:標準基向量的表示矩陣
是否有一個方便的方法來創建這樣一個矩陣(即給定一個位置矢量在每行中的位置)?
另外,是否有一種方法我應該代表這樣一個矩陣,以便與倍頻可以在八度更有效地完成?
假設你想在1列3,那些一個3x3矩陣,和2分別爲:
> pos = [3,1,2];
> x = eye(3)(pos,:);
會給你一個矩陣,9種元素,最爲零,在所需的地方的人。您可以使用稀疏表示來節省內存:sparse_x = sparse(x);
。但在我的機器上進行的以下測試意味着自然形式的乘法更快:
> N = 10000;
> s = rand(N,N);
> x = eye(N)(randperm(N),:);
> sx = sparse(x);
> t = cputime(); ss = s*x; cputime()-t
ans = 0.41124
> t = cputime(); ss2 = s*sx; cputime()-t
ans = 1.0313
這是Core i7上的Octave 3.4,YMMV。如果它知道x
是特殊的,也許它在乘法已經採取的加速優勢
> whos
Variables in the current scope:
Attr Name Size Bytes Class
==== ==== ==== ===== =====
N 1x1 8 double
s 10000x10000 800000000 double
ss 10000x10000 800000000 double
ss2 10000x10000 800000000 double
sx 10000x10000 160004 double
x 10000x10000 40000 double <---SMALLER THAN s!
:
看着whos
看來,倍頻是做一些巧妙搭配x
。
這很有趣。 'x'的存儲只有4個字節/行,這表明它只存儲每行一個整數 - 我想看到的確切類型的優化。但試試它與一個非方陣(行>列),看看是否有類似的結果。 Octave _可以檢測到'eye(N)(randperm(N),:)'是一個置換矩陣,並相應地進行優化。 – ErikR