可以内联定义一维图像吗?
Can one define a one dimensional image inline?
我想描述一个长度为 2 的非常简单的图像(实际上是一个向量),例如 (1,2)
用于某些线性代数的目的。
下面创建一个 y 轴长度为 1 的二维图像:
image a := [2,1]: {
{1, 2}
}
MatrixPrint(a)
这输出
{
{1, 2}
}
我如何以类似的方式输出它?
{123,45}
此外,如果我有任意形状的图像 (a, b)
,我如何将其切片以提取值 n
的一维图像,沿 x 轴或 y 轴? (沿其中一个图像轴提取线轮廓)
在您的示例中,您 定义了 2D 图像,因此您获得了 2D 输出。如果图像真的是一维的,你的输出将是一维的,即
image a := [2]: {123, 45}
MatrixPrint(a)
所以你的第二个问题实际上是你第一个问题的答案:你需要对数据进行一维切片,你可以使用命令 slice1()
来完成,如下所示:
image a := [2,1]: {
{123, 45}
}
MatrixPrint( a.slice1(0,0,0,0,2,1) )
注意命令的一些特殊性:
- 该命令始终假设 输入是 3D,因此前 3 个参数是起始索引三元组 x/y/z,即使它只是 2D 或 1D 数据。
- 第二个三元组指定切片的采样。首先是维度索引 (0=x),然后是采样步数 (2),然后是步长 (1)
2D 切片、3D 切片和来自 nD 数据的 nD 切片存在类似的切片命令。
matrixPrint
命令只输出到结果window。无法将其重新路由到某个字符串。但是,您可以轻松地为自己创建一个可以做到这一点的方法(尽管对于大数据来说不是很快):
string VectorPrint( image img, string FormatStr, number maxNum )
{
if ( !img.ImageIsValid() ) return "{invalid}"
if ( 1 != img.ImageGetNumDimensions() ) return "{not 1D}"
string out = "{ "
number nx = img.ImageGetDimensionSize(0)
if (( nx <= maxNum ) || ( maxNum <= 2) )
{
for( number i=0; i<min(nx,maxNum); i++)
out += Format( sum(img[0,i]), FormatStr ) + ", "
out = out.left( out.len() - 2 )
}
else
{
for( number i=0; i<maxNum-1; i++)
out += Format( sum(img[0,i]), FormatStr ) + ", "
out = out.left( out.len() - 2 ) + ", ... , "
out += Format( sum(img[0,nx-1]), FormatStr )
}
out += " }"
return out
}
image a := [10,4]: {
{1,2,3,4,5,6,7,8,9,10},
{123, 45, 12.3, -12, 55, 1.2, 9999, 89.100, 1e-10, 0},
{0,0,0,0,0,0,0,0,0,0},
{1,2,3,4,5,6,7,8,9,10}
}
// Slice 2D image to 1D image at n'th line
number n = 1
image line := a.slice1(0,n,0,0,a.ImageGetDimensionSize(0),1)
// Printout with given number format and a maximum number of entries
string fStr = "%3.1f"
number maxN = 3
Result( "\n "+VectorPrint( line, fStr, maxN ) )
我想描述一个长度为 2 的非常简单的图像(实际上是一个向量),例如 (1,2)
用于某些线性代数的目的。
下面创建一个 y 轴长度为 1 的二维图像:
image a := [2,1]: {
{1, 2}
}
MatrixPrint(a)
这输出
{
{1, 2}
}
我如何以类似的方式输出它?
{123,45}
此外,如果我有任意形状的图像 (a, b)
,我如何将其切片以提取值 n
的一维图像,沿 x 轴或 y 轴? (沿其中一个图像轴提取线轮廓)
在您的示例中,您 定义了 2D 图像,因此您获得了 2D 输出。如果图像真的是一维的,你的输出将是一维的,即
image a := [2]: {123, 45}
MatrixPrint(a)
所以你的第二个问题实际上是你第一个问题的答案:你需要对数据进行一维切片,你可以使用命令 slice1()
来完成,如下所示:
image a := [2,1]: {
{123, 45}
}
MatrixPrint( a.slice1(0,0,0,0,2,1) )
注意命令的一些特殊性:
- 该命令始终假设 输入是 3D,因此前 3 个参数是起始索引三元组 x/y/z,即使它只是 2D 或 1D 数据。
- 第二个三元组指定切片的采样。首先是维度索引 (0=x),然后是采样步数 (2),然后是步长 (1)
2D 切片、3D 切片和来自 nD 数据的 nD 切片存在类似的切片命令。
matrixPrint
命令只输出到结果window。无法将其重新路由到某个字符串。但是,您可以轻松地为自己创建一个可以做到这一点的方法(尽管对于大数据来说不是很快):
string VectorPrint( image img, string FormatStr, number maxNum )
{
if ( !img.ImageIsValid() ) return "{invalid}"
if ( 1 != img.ImageGetNumDimensions() ) return "{not 1D}"
string out = "{ "
number nx = img.ImageGetDimensionSize(0)
if (( nx <= maxNum ) || ( maxNum <= 2) )
{
for( number i=0; i<min(nx,maxNum); i++)
out += Format( sum(img[0,i]), FormatStr ) + ", "
out = out.left( out.len() - 2 )
}
else
{
for( number i=0; i<maxNum-1; i++)
out += Format( sum(img[0,i]), FormatStr ) + ", "
out = out.left( out.len() - 2 ) + ", ... , "
out += Format( sum(img[0,nx-1]), FormatStr )
}
out += " }"
return out
}
image a := [10,4]: {
{1,2,3,4,5,6,7,8,9,10},
{123, 45, 12.3, -12, 55, 1.2, 9999, 89.100, 1e-10, 0},
{0,0,0,0,0,0,0,0,0,0},
{1,2,3,4,5,6,7,8,9,10}
}
// Slice 2D image to 1D image at n'th line
number n = 1
image line := a.slice1(0,n,0,0,a.ImageGetDimensionSize(0),1)
// Printout with given number format and a maximum number of entries
string fStr = "%3.1f"
number maxN = 3
Result( "\n "+VectorPrint( line, fStr, maxN ) )