我试图使用BEpos和BEneg等密钥访问稀疏mlf,每行一个密钥。现在的问题是,大多数命令并不是要处理太大的输入:bin2dec需要没有空格的干净二进制数,但正则表达式黑客行为不能太多 - 依此类推。
如何使用稀疏密钥访问稀疏数据?
示例
K>> mlf=sparse([],[],[],2^31,1);
BEpos=Cg(pos,:)
BEpos =
(1,1) 1
(2,3) 1
(2,4) 1
K>> mlf(bin2dec(num2str(BEpos)))=1
Error using bin2dec (line 36)
Binary string must be 52 bits or less.
K>> num2str(BEpos)
ans =
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
K>> bin2dec(num2str('1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0'))
Error using bin2dec (line 36)
Binary string must be 52 bits or less.
K>> regexprep(num2str(BEpos),'[^\w'']','')
Error using regexprep
The 'STRING' input must be a one-dimensional array
of char or cell arrays of strings.
手动
K>> mlf(bin2dec('1000000000000000000000000000000'))
ans =
All zero sparse: 1-by-1
答案 0 :(得分:2)
考虑使用手动二进制到十进制转换的不同方法:
pows = pow2(size(BEpos,2)-1 : -1 : 0);
inds = uint32(BEpos*pows.')
我没有对此进行基准测试,但它可能比bin2dec
和单元格数组更快。
这很简单:2的幂被计算并存储在pows
中(假设MSB位于最左边的位置)。然后将它们乘以匹配位置中的位并求和以产生相应的十进制值。
答案 1 :(得分:0)
尝试使用此索引:
inds = uint32( bin2dec(cellstr(num2str(BEpos,'%d'))) );