Если ширина содержимого неизвестна, вы можете использовать следующий метод. Предположим, что у нас есть эти два элемента:
.outer
- полная ширина .inner
- не установлена ширина (но может быть указана максимальная ширина) Предположим, что вычисленная ширина элементов равна 1000px и 300px соответственно. Выполните следующие действия:
.inner
внутри .center-helper
.center-helper
встроенным блоком; он становится того же размера, что и .inner
, делая его шириной 300 пикселей. .center-helper
на 50% относительно родителя; это помещает его влево на 500px wrt. внешний. .inner
50% слева относительно его родителя; это помещает его левое на -150px wrt. который означает, что его левый угол равен 500 - 150 = 350px.
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%;
}
Я могу только надеяться, что ребята 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])
Вы можете обмануть, глядя на пакет GNU Octave image . В качестве языка скриптов есть im2col и col2im:
Насколько я понимаю, он отличается большинством в стиле комментариев (# вместо%) и другим строковым стилем (вместо «). Если вы измените это и удалите тест assert внизу, это может быть
Кроме того, знайте о лицензии (GPLv3). Это бесплатно, но ваши изменения также должны быть бесплатными!