Этот вопрос является продолжением вопроса, который я задал здесь: Простой способ удаления столбца матрицы в Mathematica , на который @belisarius и @Daniel предоставили очень полезные ответы.
То, что я обычно пытаюсь сделать, - это извлечь из матрицы A определенные строки и столбцы ИЛИ то, что остается после того, что те, которые указаны, удалены.Таким образом, это может быть формально записано как, найдите TakeOperator и Drop Operator так, чтобы:
TakeOperator [A, {i1, .., ip}, {j1, ..., jq}] = (A [[ik]] [[jl]]) (1 <= k <= p, 1 <= l <= q) = <code>Table[A[[ik]][[jl]],{k,p},{l,q}]
Отметим Ic = {i'1, ..., i'р'} = Complement
[{1, ..., Length[A]
}, {i1, ..., ф}]; Jc = {J'1, ..., j'q '} = Complement
[{1, ..., Length[A]
}, {j1, ..., jq}];
DropOperator [A, {i1, .., ip}, {j1, ..., jq}] = (A [[ik]] [[jl]]) (1 <= k '<= p', 1 <= l '<= q') = <code>Table[A[[ik']][[jl']],{k',p'},{l','q}]
В то время как Table
, как описано выше, делает свое дело, использовать Table таким образом крайне неэффективно.
Просто, чтобы дать идею, я взял пример @ belisarius:
In: First@Timing[a = RandomInteger[1000, {5000, 5000}];]
Out:0.218
In:Clear[b,c]
In:First@Timing[
b = Table[
If[i < 100, If[j < 100, a[[i]][[j]], a[[i]][[j + 1]]],
If[j < 100, a[[i + 1]][[j]], a[[i + 1]][[j + 1]]]], {i,
4999}, {j, 4999}]]
Out:140.807
In:First@Timing[c = Drop[a, {100}, {100}]]
Out:0.093
In:c===b
Out:True
Примечание. Что касается использования Drop
в предыдущем посте, я подумал и об его использовании., но когда я проверил документацию, не было никакого предложения сделать это так, как предлагали @belisarius и @daniel.Если бы документация могла обновляться в этом направлении в будущих выпусках, это было бы полезно.