【问题标题】:Sparsify a kernel/similarity matrix in matlab在matlab中稀疏化内核/相似度矩阵
【发布时间】:2014-09-15 01:26:16
【问题描述】:

我正在做一些内核 PCA 并想要稀疏矩阵。我在 Python 中做了所有事情,现在想将我的代码转换为 matlab 进行比较。

我在想稀疏化内核矩阵的时候有点挣扎。在 Python 中,这对我来说非常简单。这是一个简单矩阵的示例,可以向您展示我的意思:

import numpy as np
print('Sparsify a matrix by zeroing all elements but the top 2 values in a row.\n')

A = np.array([[1,2,3,4,5],[9,8,6,4,5],[3,1,7,8,9]])

print('Before:\n%s\n' %A)

for row in A:
    sort_idx = np.argsort(row)[::-1] # get indexes of sort order (high to low)
    for i in sort_idx[2:]:
        row[i]=0

print('After:\n%s\n' %A)


Sparsify a matrix by zeroing all elements but the top 2 values in a row.

Before:
[[1 2 3 4 5]
 [9 8 6 4 5]
 [3 1 7 8 9]]

After:
[[0 0 0 4 5]
 [9 8 0 0 0]
 [0 0 0 8 9]]

那么,我将如何在 matlab 中做到这一点?

如果你能在这里帮助我,那就太好了。是否有等效于argsort 的方法,即连续获取例如 3 个最低值以便我可以将它们设置为 0?

【问题讨论】:

    标签: python matlab matrix


    【解决方案1】:

    一种方法 -

    [m,n] = size(A); %// get size
    [~,col_ind]= sort(A,2,'descend') %// sort the rows in descending order
    A(bsxfun(@plus,(col_ind(:,3:end)-1)*m,[1:m]'))=0 %// get all indices other than 
                 %// for top 2 values in each row and set those in A to zero
    

    请记住,使用这种方法时,将保留最大值和第二最大值的第一个匹配项。

    示例运行 -

    A (Before) =
         1     2     3     4     5
         9     8     6     4     5
         3     1     7     8     9
         5     6     2     6     7
    
    A (After) =
         0     0     0     4     5
         9     8     0     0     0
         0     0     0     8     9
         0     6     0     0     7
    

    【讨论】:

    • 非常感谢。关于“...第一个最大匹配和第二个最大匹配...”的注释 - 知道这一点很重要,但对于我的应用程序来说,这并不重要,因为我有“真实”(浮点)值
    • @SebastianRaschka 我明白了,太棒了!
    猜你喜欢
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 2012-06-20
    • 2013-01-12
    • 2013-03-02
    • 1970-01-01
    相关资源
    最近更新 更多