用值'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
答
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
谢谢你的解决方案,并且说明。我仍然不明白为什么第二个解决方案,我有工作......它仍然是一个数组添加到数组..但结果是2x10矩阵。 – Christopher
第一个解决方案将20个数组添加到$ m数组中。第二个创建两个包含10个项目(1-10)的数组,这就是你想要的。 12瓶和两个6包装有区别。 '$ m =,(@(0)* 10)'将与第二个解决方案相同(并且它也可以正常工作,尽管它更杂乱) –