鉴于我的代码:
G=zeros(height,width); %zeros or whatever
for y = 1 : height
for x = 1 : width
magnitude = sqrt(Gx(y,x)^2 + Gy(y,x)^2);
gradient_direction = atan(Gy(y,x)/Gx(y,x));
G(y,x) = [magnitude gradient_direction];
end
end
我继续这样做(如果我不使用零()):
订阅的分配维度不匹配。
或者这个:
分配比非单身人士具有更多非单身人士rhs维度 标
答案 0 :(得分:2)
虽然@atru的答案有效,但我想建议一种更快更整洁的矢量化方式,如果这样做有帮助的话。这里的操作可以很容易地转换为矢量化操作:
G=cat(3,hypot(Gy,Gx),atan(Gy./Gx));
答案 1 :(得分:1)
通过使用[<CLIMutable>]
type Snippet = { title: string; tags: Collections.Generic.List<String> }
[<CLIMutable>]
type Item = { snippet : Snippet }
[<CLIMutable>]
type Response = { items : Collections.Generic.List<Item> }
[<Test>]
let ``Apply tags to videos`` () =
let delimitedIds = ["id1";"id2";"id3"] |> String.concat ","
let url = String.Format(requestTagsUrl, apiKey, delimitedIds)
let response = httpClient.GetAsync(url) |> Async.AwaitTask |> Async.RunSynchronously
if response.IsSuccessStatusCode
then let root = response.Content.ReadAsAsync<Response>() |> Async.AwaitTask |> Async.RunSynchronously
root.items.Count |> should equal 2
else Assert.Fail()
,您尝试将两个值分配给为索引为G(y,x,:) = [magnitude, gradient_direction];
的单个值保留的点。解决此问题的一种方法是使用三维数组G,
(y,x)
现在,在每个点G(y,x),您可以存储这两个值,并在G=zeros(height,width,2);
for y = 1 : height
for x = 1 : width
magnitude = sqrt(Gx(y,x)^2 + Gy(y,x)^2);
gradient_direction = atan(Gy(y,x)/Gx(y,x));
G(y,x,:) = [magnitude, gradient_direction];
end
end
位置G(1,2,1)
magnitude
处为(1,2)
实例G(1,2,2)
访问它们为gradient_direction
。这假定Gx
和Gy
都是大小高度为x宽的数组。
需要注意的重要一点是沿第三维的G切片也将是3D数组,即mag_dir = G(3,2,:)
的大小为[1 1 2]
而不是[1 2]
。这可能会导致某些应用程序出错,例如包括尝试将mag_dir
与另一个向量(没有额外维度)和线性代数运算连接起来。
要解决此问题,请使用reshape将维度明确更改为目标维度。对于这里的向量,它将是reshape(mag_dir, 1, 2)
。对于像more_md = G(1,:,:)
这样的2D切片也是如此 - 这需要实例more_md = reshape(more_md,2,5)
。