Альтернативные способы разделить матричный блок на трехмерную матрицу [duplicate]

Если ширина содержимого неизвестна, вы можете использовать следующий метод. Предположим, что у нас есть эти два элемента:

  • .outer - полная ширина
  • .inner - не установлена ​​ширина (но может быть указана максимальная ширина)

Предположим, что вычисленная ширина элементов равна 1000px и 300px соответственно. Выполните следующие действия:

  1. Оберните .inner внутри .center-helper
  2. Сделайте .center-helper встроенным блоком; он становится того же размера, что и .inner, делая его шириной 300 пикселей.
  3. Нажмите .center-helper на 50% относительно родителя; это помещает его влево на 500px wrt. внешний.
  4. Push .inner 50% слева относительно его родителя; это помещает его левое на -150px wrt. который означает, что его левый угол равен 500 - 150 = 350px.
  5. body {
      font: medium sans-serif;
    }
    
    .outer {
      overflow: hidden;
      background-color: papayawhip;
    }
    
    .center-helper {
      display: inline-block;
      position: relative;
      left: 50%;
      background-color: burlywood;
    }
    
    .inner {
      display: inline-block;
      position: relative;
      left: -50%;
      background-color: wheat;
    }
    <div class="outer">
      <div class="center-helper">
        <div class="inner">
          <h1>A div with no defined width</h1>
          <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.<br>
              Duis condimentum sem non turpis consectetur blandit.<br>
              Donec dictum risus id orci ornare tempor.<br>
              Proin pharetra augue a lorem elementum molestie.<br>
              Nunc nec justo sit amet nisi tempor viverra sit amet a ipsum.</p>
        </div>
      </div>
    </div>
    ]

    .outer {
        overflow: hidden;
    }
    .center-helper {
        float: left;
        position: relative;
        left: 50%;
    }
    .inner {
        float: left;
        position: relative;
        left: -50%;
    }
    
    9
    задан Royi 4 June 2016 в 19:25
    поделиться

    2 ответа

    Я могу только надеяться, что ребята Mathworks не подадут в суд на вас или меня или Stackoverflow в этом отношении, пытаясь создать векторизованные реализации своих функций IP-панели инструментов, поскольку они поставили цену на этот инструментарий. Но в любом случае, забывая о тех проблемах, вот реализации.

    Замена для im2col с опцией 'sliding'

    Мне не удалось векторизовать это, пока я не сел написать решение другой задачи на Stackoverflow . Итак, я бы настоятельно рекомендовал заглянуть в нее.

    function out = im2col_sliding(A,blocksize)
    
    nrows = blocksize(1);
    ncols = blocksize(2);
    
    %// Get sizes for later usages
    [m,n] = size(A);
    
    %// Start indices for each block
    start_ind = reshape(bsxfun(@plus,[1:m-nrows+1]',[0:n-ncols]*m),[],1); %//'
    
    %// Row indices
    lin_row = permute(bsxfun(@plus,start_ind,[0:nrows-1])',[1 3 2]);  %//'
    
    %// Get linear indices based on row and col indices and get desired output
    out = A(reshape(bsxfun(@plus,lin_row,[0:ncols-1]*m),nrows*ncols,[]));
    
    return;
    

    Замена для im2col с опцией 'distinct'

    function out = im2col_distinct(A,blocksize)
    
    nrows = blocksize(1);
    ncols = blocksize(2);
    nele = nrows*ncols;
    
    row_ext = mod(size(A,1),nrows);
    col_ext = mod(size(A,2),ncols);
    
    padrowlen = (row_ext~=0)*(nrows - row_ext);
    padcollen = (col_ext~=0)*(ncols - col_ext);
    
    A1 = zeros(size(A,1)+padrowlen,size(A,2)+padcollen);
    A1(1:size(A,1),1:size(A,2)) = A;
    
    t1 = reshape(A1,nrows,size(A1,1)/nrows,[]);
    t2 = reshape(permute(t1,[1 3 2]),size(t1,1)*size(t1,3),[]);
    t3 =  permute(reshape(t2,nele,size(t2,1)/nele,[]),[1 3 2]);
    out = reshape(t3,nele,[]);
    
    return;
    

    Некоторые быстрые тесты показывают, что обе эти реализации, особенно sliding, для входных данных с малым и приличным размером и distinct для всех данных, работают намного лучше, чем встроенные реализации функций MATLAB с точки зрения производительности во время выполнения.

    Как использовать

    With in-built MATLAB function - 
    B = im2col(A,[nrows ncols],'sliding')
    
    With our custom function - 
    B = im2col_sliding(A,[nrows ncols])
    
    %// ------------------------------------
    
    With in-built MATLAB function - 
    B = im2col(A,[nrows ncols],'distinct')
    
    With our custom function - 
    B = im2col_distinct(A,[nrows ncols])
    
    17
    ответ дан Community 23 August 2018 в 19:32
    поделиться

    Вы можете обмануть, глядя на пакет GNU Octave image . В качестве языка скриптов есть im2col и col2im:

    Насколько я понимаю, он отличается большинством в стиле комментариев (# вместо%) и другим строковым стилем (вместо «). Если вы измените это и удалите тест assert внизу, это может быть

    Кроме того, знайте о лицензии (GPLv3). Это бесплатно, но ваши изменения также должны быть бесплатными!

    3
    ответ дан Markus 23 August 2018 в 19:32
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: