如何從矩陣/向量中刪除一組值?你好。 我有一個大的值向量(即一維矩陣),我想從中刪除值的子集,其中該子集包含原始向量中的一組非順序值。 例如:
大向量 = [1,2,3,4,5]
子集 = [2,5]
期望結果 = [1,3,4]
我想知道是否存在可以在 JSL 中執行此操作的簡單命令或命令集? 我可以使用 For 循環來做到這一點,但想知道是否有更優雅或更快速的方法?
回复:如何從矩陣/向量中刪除一組值?謝謝杰夫! 1000倍已經很不錯了。 我實際上沒有意識到可以為一行分配一個空矩陣來刪除它。
我已經向技術支持建議該文檔需要更改或需要加快緩慢的方法。
回复:如何從矩陣/向量中刪除一組值?DataM = J( 1067000, 8, Random Normal() ) || J( 1067000, 1, Random Binomial( 1, 0.07 ) );
DataM1 = DataM;
DataM2 = DataM;
Close( dt, nosave );
start = Tick Seconds();
foo = As Table( DataM, <<INVISIBLE></INVISIBLE>
結果:
data_table_method = 1.0333333333333;
matrix_method1 = 49.166666666667;
matrix_method2 = 0.066666666666606;
@Craige_Hales ' 方法 (matrix_method2) 是最快的。
我很好奇使用數據表是否會很快,雖然它比 Matrix_method2 慢 15 倍,但對於這個中等大小的問題來說它仍然相當快。 然後我很好奇,如果您的數據已經在數據表中(避免與數據表之間的轉換),那麼需要多長時間,而且速度會更快。
foo = As Table( DataM, <<INVISIBLE></INVISIBLE>
結果:
data_table_method2 = 0.316666666666606
回复:如何從矩陣/向量中刪除一組值?是的。 使用 != 獲取相反的位置,然後
數據M = 數據M[rr,0];
應該快 100 倍。
我懷疑你這樣做的方式會為每個刪除的行重新創建數組。回复:如何從矩陣/向量中刪除一組值?@Craige_Hales ,
您對有效地從大矩陣中刪除行有什麼想法嗎?
我遇到的情況是,我的數據矩陣大於 100 萬行 x 9 列(現在前面的示例中為 1,604,736 x 9 )
我需要刪除一些行,實際上> 78 k 行。 這就是我現在正在做的事情
rr = Loc(DataM[0,4] == 1);
DataM[rr,0] = [];
所以我正在尋找第 4 列 = 1 的情況,並且我希望所有這些行都消失。
Loc() 行非常快(< 0.05 秒),但下面的行非常慢(83 秒)!
我正在使用 JMP 文檔,我在其中讀到:
刪除行和列是通過將空矩陣分配給該行或列來完成的。
A[k, 0] = []; //刪除第k行
A[0, k] = []; //刪除第k列
也許我只是因為我的數據矩陣很大而陷入困境
我不清楚是否可以使用關聯數組技巧,因為我正在處理矩陣而不是向量
湯姆
回复:如何從矩陣/向量中刪除一組值?謝謝克雷格。
您的第一個假設是正確的:我希望從包含 1,2,3,4,5 的向量中刪除 2 和 5 的文字值。另一個有助於澄清的例子,我希望從largevect中刪除這個子集向量:
大向量 = [12, 189, 3, 78, -2]
子集 = [189, -2]
期望結果 = [12, 3, 78]
我不太用過 AA,但我喜歡用它作為解決方案。 謝謝您的幫助!
回复:如何從矩陣/向量中刪除一組值?可能需要更多信息才能很好地回答這個問題。
如果您正在進行集合運算,請參閱JSL集合操作有關使用關聯數組執行此操作的方法:
// this would be a little more natural using lists
// or associative arrays, but it is easy to make an
// associative array set from a matrix:
largevect = [20, 30, 40, 50, 10];
subset = [20, 50];
aaBigSet = Associative Array( largevect );
aaSmallSet = Associative Array( subset );
// remove the small set from the big set
aaBigSet << Remove( aaSmallSet );
// getkeys returns a list, make a matrix
result = Matrix( aaBigSet << getkeys );
// the original order is lost, but the set is correct
show(result); // [10, 30, 40];
您的示例中不清楚是否子集是值列表或值的索引。 如果是索引,並且您可以生成要保留的索引集而不是要刪除的索引集,那麼就很簡單
largevect = [20, 30, 40, 50, 10];
keepers = [1,3,4];
desired result = largevect[ keepers ];
show(desiredResult); // [20, 40, 50];