2011-11-18 453 views
1

假設我有一個矩陣,使得每行是一個標準的基礎的載體,即每一行包含正好一個如圖1所示,其他列是0八度:標準基向量的表示矩陣

是否有一個方便的方法來創建這樣一個矩陣(即給定一個位置矢量在每行中的位置)?

另外,是否有一種方法我應該代表這樣一個矩陣,以便與倍頻可以在八度更有效地完成?

回答

2

假設你想在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

+0

這很有趣。 'x'的存儲只有4個字節/行,這表明它只存儲每行一個整數 - 我想看到的確切類型的優化。但試試它與一個非方陣(行>列),看看是否有類似的結果。 Octave _可以檢測到'eye(N)(randperm(N),:)'是一個置換矩陣,並相應地進行優化。 – ErikR