Re: problem with Delete[]
- To: mathgroup at smc.vnet.net
- Subject: [mg58948] Re: problem with Delete[]
- From: Peter Pein <petsie at dordos.net>
- Date: Sun, 24 Jul 2005 01:22:09 -0400 (EDT)
- References: <dbt3vk$sn3$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Heath Gerhardt schrieb:
> Hello,
>
> Delete[] is not removing elements of v in the following function, could
> anyone tell me why?
>
> Rn[N_, p_] := Module[{A, v, c, q, i, j},
> A = Table[0, {i, 1, N}, {j, 1, N}];
> v = Table[i, {i, 2, N}];
> c = 1;
> For[i = 1, i < N, i++,
> j = Random[Integer, {1, Dimensions[v][[1]]}];
> A[[c, v[[j]]]] = 1;
> A[[v[[j]], c]] = 1;
> q = Random[];
> If[q > p, c = v[[j]]];
> Delete[v, j];
> ];
> A
> ]
>
> thanks in advance,
> Heath
>
Hi,
you forgot to assign the new (shorter) vector to v:
...
v=Delete[v,j]
];A]
========================
If you have to generate large matrices, consider another approach:
Pn[N_, p_] := Module[{a = {}, c = 1},
Fold[(a = {a, c, #1[[#2]]};
If[Random[] > p, c = #1[[#2]]];
Delete[#1, #2]) & ,
Range[2, N],
Random[Integer, {1, #1}]& /@ Range[N - 1, 1, -1]];
a = Union[Partition[Join[#1, Reverse[#1]]&[Flatten[a]], 2]];
Normal[SparseArray[(#1 -> 1 & ) /@ a, {N, N}]]];
or omit the call to Normal to use SparseArrays (and about 0.1% of the
RAM used by the normalized array).
The version using For[] needs about Pi seconds ;-) for a 5555x5555 matrix:
Timing[Rn[5555, 0.5555];]
>>>{3.141*Second, Null}
The version using Fold[] and Map[] ("/@") needs for the same task:
Timing[Pn[5555, 0.5555];]
>>>{0.313*Second, Null}
--
Peter Pein
Berlin