Matlab 将操作应用于每个单元都是多边形的单元阵列

Matlab 将操作应用于每个单元都是多边形的单元阵列,matlab,Matlab,我有一些问题需要我使用诸如平移、缩放、旋转和剪切等操作来操纵多边形。我拥有的数据实际上是特拉华州data.gov上的州边界和几何图形。函数delaware.m返回描述特拉华州形状的多边形矩阵的单元数组(1x3单元),这就是我需要对其执行操作的形状。我会发布具体的问题,这样你就可以了解我被问到了什么,但我仍然要求提供更多的一般性指导,而不是每个问题的具体答案 平移特拉华州,使其中心大致位于原点 扩大特拉华州的平移范围,使其位于以原点为中心的边长正方形内 旋转经过平移、扩张的特拉华州,使纽卡斯尔县位

我有一些问题需要我使用诸如平移、缩放、旋转和剪切等操作来操纵多边形。我拥有的数据实际上是特拉华州data.gov上的州边界和几何图形。函数delaware.m返回描述特拉华州形状的多边形矩阵的单元数组(1x3单元),这就是我需要对其执行操作的形状。我会发布具体的问题,这样你就可以了解我被问到了什么,但我仍然要求提供更多的一般性指导,而不是每个问题的具体答案

  • 平移特拉华州,使其中心大致位于原点
  • 扩大特拉华州的平移范围,使其位于以原点为中心的边长正方形内
  • 旋转经过平移、扩张的特拉华州,使纽卡斯尔县位于底部,苏塞克斯位于顶部
  • 在不改变特拉华州面积的情况下,扩张特拉华州的平移、扩张和旋转,使其宽度与高度相同
  • 剪切特拉华州的平移、扩张、旋转、扩张状态最北端在最南端右侧至少2个单位
  • 问题是,我知道如何用一个多边形/矩阵在Matlab中完成所有这些操作。我主要是在为如何在cell阵列中使用它而挣扎

    例如,假设我有矩阵S

    newS=S+[1;2]; %move S one unit to the right and two units up
    
    R=[sqrt(2)/2  -sqrt(2)/2; sqrt(2)/2  sqrt(2)/2];
    newS=R*S  %rotate the polygon by 45 degrees
    
    D = [alpha 0; 0 beta]; 
    %alpha is the dilation scaling the x direction and beta in the y direction
    %left multiply S by this dilation matrix to dilate along the cardinal axes
    
    Sh=[1 y; 0 1] %y controls the amount of shearing
    %left multiply by S to shear a shape along the x-axis relative to the y-axis
    
    例如,当我尝试做一个向上/向下/向左/向右移动形状的操作时,我得到了错误消息
    类型为“cell”的输入参数的未定义运算符“+”。

    我还尝试:

    DEBoundary1 = cellfun(@sum, DEBoundary, [75.562;-39.6]); 
    %this is how much I wanted to move the polygons
    
    但是得到:

    >> Lab_code
    Error using cellfun
    All of the input arguments must be of the same size and shape.
    Previous inputs had size 1 in dimension 1. Input #3 has size 2
    

    我想一般来说,有没有一种简单的方法可以将我已经知道的这些操作应用到由多边形矩阵组成的单元数组中?或者我必须用另一种方式来做吗?

    我相信这就是你试图用你的
    +
    示例来做的:

    DEBoundary = {[0 1 -1 0; 1 -1 -1 1], [0 -1 1 0; 1 1 1 1]};
    offset = [3;-2];
    
    DEBoundary1 = cellfun(@(c) c + offset, DEBoundary, 'UniformOutput', false)
    
    它的作用是:

    cellfun(@(c)                   % c is each element in the cell
                c + offset         % add the offset to each element
                          , DEB    % The cell array to operate on
            'UniformOutput', 0)    % Specifies that the output is a cell and not a scalar
    

    如果您认为cellfun令人困惑,则可以手动执行此操作:

    DEBoundary1 = cell(size(DEBoundary))
    for i = 1:numel(DEBoundary)
       DEBoundary1{i} = DEBoundary{i} + offset;
    end
    

    这应该也适用于乘法和其他运算,只要维度匹配(但这是一个数学问题,不是MATLAB特有的)。

    您能否显示此处未包含的不同变量,最重要的是
    s
    ,但最好是所有变量。如果它们很大,请尝试缩小它们的尺寸。S只是我命名的一个通用矩阵,所以我可以证明我知道如何将这些运算应用于奇异矩阵。然而,如果你想举个例子,那么S可以是,比如说,
    [01-10;1-1-11]
    ,如果绘制的话,它可以形成一个三角形。这里,称为DEBoundary的单元数组有1x3个条目。第一个单元是2x12矩阵。第二个单元格是2x5矩阵。第三个单元格是2x250矩阵。我现在想不出一个最小的可重复的例子,但如果我能想到一个,我会再次尝试并评论。如果
    S=[01-10;1-1-11]
    ,那么您将不会收到以下错误消息:“对于
    'cell'
    类型的输入参数,未定义运算符“+”,因为
    S
    不是单元格。很抱歉造成混淆。在DEBoundary上使用该运算符时,我会收到该错误消息。我尝试使用
    DEBoundary1=DEBoundary+[75.562;-39.6]翻译,但由于它是一个单元格数组,我得到了一个错误。我尝试了上面提到的
    cellfun
    函数,但它也不喜欢我写的东西。