用值'0'初始化大小'X'的矩阵'X'

问题描述:

我试图启动一个10x10的矩阵,其中每个单元格的值为0.但是看起来它没有创建第二列当我以这种方式初始化矩阵时。用值'0'初始化大小'X'的矩阵'X'

$m = ,@(0) * 10 
$m += ,@(0) * 10 
$m | %{"$_"} 

然而,这种方法会正确设置的行(但不是在0初始化细胞像我想)

$m = ,@(1..10) 
$m += ,@(1..10) 
$m | %{"$_"} 

预期输出:

 
0 0 0 0 0 0 0 0 0 0 
0 0 0 0 0 0 0 0 0 0 

我宁可不要迭代单元格以重置它们。 解释为什么当我以第一种方式进行操作时,它只会生成一列,这也是有帮助的。

当您将某些东西加在一起时,表达式的左边将决定结果。由于表达式的左边是一个数组,它会将数组的内容与新值合并。 10个阵列+ 10个阵列=您的$m - 数组现在包含20个单项数组。它是一个二维数组/矩阵,但它是20x1而不是2x10。

$m.Count 
20 

$m[0].Count 
1 

要知道,数组是引用类型,所以您要创建引用(指针)相同的单项数组,这意味着会出现这种情况的10个人副本:

$m[0][0] = 1 
$m | % {"$_"} 
1 
1 
1 
1 
1 
1 
1 
1 
1 
1 
0 
0 
0 
0 
0 
0 
0 
0 
0 
0 

我会使用foreach循环来创建十个项目的十个数组(在示例中使用3来缩短演示)。

$m = 1..3 | % { ,(1..3 | % { 0 }) } 

$m.Count 
3 

$m[0].Count 
3 

$m[0][0] = 1 
$m[2][1] = 1 
$m | % {"$_"} 
1 0 0 
0 0 0 
0 1 0 
+0

谢谢你的解决方案,并且说明。我仍然不明白为什么第二个解决方案,我有工作......它仍然是一个数组添加到数组..但结果是2x10矩阵。 – Christopher

+1

第一个解决方案将20个数组添加到$ m数组中。第二个创建两个包含10个项目(1-10)的数组,这就是你想要的。 12瓶和两个6包装有区别。 '$ m =,(@(0)* 10)'将与第二个解决方案相同(并且它也可以正常工作,尽管它更杂乱) –

Frode F.'s helpful answer解释了您的解决方案尝试良好的问题。

$arr2d = New-Object 'int[,]' (10, 10) # Create a 10 x 10 [int] array, initialized to all 0s 

注意事项:

但是,您可以有效地利用New-Object创造真正的,初始化-TO-0多维数组

  • 试图追加+=这样一个数组悄悄地flattens it单个-dimensional,带有新元素(附加) - 奇怪的是,即使是类型限制变量([int[,]] $arr2d = New-Object ...)也无法防止这种情况。

  • 范围表述如0..2不能在这样的阵列的索引被用于

检查所得阵列:

获取类型:

> $arr2d.GetType().Name 
Int32[,] 

获取秩(维数):

> $arr2d.Rank 
2 

获取的元素的计数每个尺寸:

> 0..($arr2d.Rank-1) | % { $arr2d.GetLength($_) } 
10 
10 

设置一些要素:

$arr2d[0,1] = 1; $arr2d[4,5] = 5; $arr2d[8,9] = 9 

枚举矩阵形式的元素:

> 0..$arr2d.GetUpperBound(0) | 
    % { $dim1=$_; (0..$arr2d.GetUpperBound(1) | % { $arr2d[$dim1, $_] }) -join ' ' } 
0 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 0 0 0 0 0 0 
0 0 0 0 0 5 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 0 0 
0 0 0 0 0 0 0 0 0 9 
0 0 0 0 0 0 0 0 0 0