Это алгоритм для произведения Кронекера. Может быть, я переключил v1
и v2
#include <vector>
#include <iostream>
using Matrix = std::vector<std::vector<double>>;
Matrix KroneckersProduct(Matrix v1, Matrix v2){
Matrix v(v1.size() * v2.size(), std::vector<double>(v1[0].size() * v2[0].size()));
for (std::size_t z1(0); z1 < v1.size(); ++z1) {
for (std::size_t z2(0); z2 < v2.size(); ++z2) {
for (std::size_t z3(0); z3 < v1[0].size(); ++z3) {
for (std::size_t z4(0); z4 < v2[0].size(); ++z4) {
v[z1*v2.size() + z2][z3*v2[0].size() + z4] = v1[z1][z3] * v2[z2][z4];
}
}
}
}
return v;
}
int main() {
Matrix v1{{3, -1},{0, 5}};
Matrix v2{{4,3,15}, {0, -5, 2}};
Matrix v(KroneckersProduct(v1, v2));
for (const auto& row : v) {
for (const auto& cell : row) {
std::cout << cell << " ";
}
std::cout << '\n';
}
return 0;
}
Выход:
12 9 45 -4 -3 -15
0 -15 6 -0 5 -2
0 0 0 20 15 75
0 -0 0 0 -25 10
Я начал бы избавляться от встроенного кода 'onclick' и связывать событие позже:
<a href="http://google.com" rel="outbound" >Click</a>
$("a[rel=outbound]").click(function(){
var url = this.href;
$.ajax({
async: false,
type: "POST",
url: "Logger.ff", //dynamic url to logging action
data: {
sid: 'abc123' //random data
clicked: url
},
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
cache: false
});
return true;
});
Кроме того, у Вас могло бы быть появление "Состояния состязания". В моем примере я установил асинхронный на ложь.
Это остановит функциональный возврат и переходить по ссылке, прежде чем запрос был выполнен.
Причина я использую async: false
вот то, потому что со значением по умолчанию, aync верен, что означает, что запрос Ajax может только быть частично передан к тому времени, когда браузер видит return: true
, и перешел далеко от страницы.
Это - то "состояние состязания", которое я упоминал. Здесь, это - низкая уловка, которая избегает его, заставляя браузер по существу остановиться, пока запрос не завершен, и затем разрешение браузера нажать на ссылку.
Более сложный ответ имел бы его, возвращают "false", (который уничтожит собственный компонент браузеров, "переходят по ссылке" поведение), и затем выполнение реального перенаправления в complete
функция.
Это не без его собственного ума проблем и могло привести к медленному поведению просмотра, в то время как запросы завершаются, позволяя пользовательскому времени нажать на другие ссылки, которые, кажется, ничего не делают, и затем в конечном счете один запрос проходит в случайное время, и происходит на вид случайное перенаправление.
Следовательно, передовые решения включают блокирующуюся остальную часть страницы и предоставления своего рода признака прогресса, в то время как запрос завершается.
(И следовательно, сложность этого решения является порядком величины тяжелее для осуществления в простом примере, чем async: false
)
Секунда больше серверного подхода, о котором Вы не могли думать, должно было бы иметь страницу, которая обрабатывает Ваши перенаправления и регистрирует данные затем.
Например:
<a href="LoggerRedirect.ff?url=http://google.com">Click</a>
Я думаю причина, которую FF приводит Вам, плохие результаты состоят в том, потому что Вы оставляете страницу, прежде чем действие займет время для выполнения. Как ссылка mhartman упоминает, используете ли Вы цель на своей внешней ссылке, она должна хорошо работать. Если Вы не можете сделать этого затем, Вам, вероятно, придется ожидать журнала для завершения, хотя можно видеть задержки навигации.
HTML-код
<a href="http://google.com" onclick="return loggClick(event);">Click</a>
function loggClick(e) {
if (!e) e = window.event;
e.preventDefault(); // cancels the link
var theLink = this.href; // stores the link for later
$.ajax({
async: false,
type: "POST",
url: "Logger.ff", //dynamic url to logging action
data: {
sid: 'abc123' //random data
},
contentType: "application/x-www-form-urlencoded; charset=UTF-8",
cache: false,
complete: function() {
// navigate when the log completes
this.location.href = theLink;
}
});
return true;
}
}
Вышеупомянутый плакат корректен, это ненадежно, потому что Вы оставляете страницу, прежде чем это будет иметь шанс зарегистрировать его.
Вы могли сделать это:
1) возвратите false, таким образом, href не активен. 2) зарегистрируйте нажимание 3) использования location.href для перенаправления к URL, к которому оно было бы перенаправлено
Вы могли бы видеть небольшую задержку, если она занимает много времени, чтобы Ваш onclick обработчик выполнился.